본문 바로가기

Algorithm

[백준] 2577번 : 숫자의 개수 - C/C++

728x90

 

문제를 보고 어떻게 풀까, 고민을 했다.

해결 과정은 아래와 같다.

 

1. int 형으로 A,B,C 3개의 수를 입력 받기

2. 세 수의 곱셈 연산 수행

3. 결과 값을 string으로 바꾸기

4. 배열을 순회하며 숫자 개수 세기

5. 결과 출력

 

 

내가 마주한 고비는 연산한 Int형 정수를 어떻게 string으로 바꾸어야 하는지부터 시작했다.

 

근데 진짜 쉽다.

<string>을 include 해주고, 원하는 값을 to_string(); 안에 넣어주기만 하면 된다.

#include <string>
...

int main(){

	int a,b,c;
	cin >> a >> b >> c;

	int mul;
	mul = a*b*c;
    
	string mulStr = to_string(mul);
...
}

 

그럼 다음 순서.

배열을 순회하며 0이 몇 번, 1부터 9까지 각각 숫자가 몇 번 쓰였는지 개수 구하기.

int ary[10] = {};

 

  • 크기가 10인 정수형 배열 ary를 선언하고, 모든 요소를 0으로 초기화
  • 배열 ary는 각 숫자(0~9)의 등장 횟수를 저장하는 용도로 사용
for(char chr : mulStr){
    
}

 

  • 문자열 mulStr의 각 문자를 chr에 저장하면서 반복

여기서 필자는 한 번의 고비를 마주하게 된다.

for문을 순회하며 각 문자를 chr에 넣는데.. 숫자를 어떻게 증가시키면서 사용된 숫자의 개수를 셀까.

 

해결 방법은 아래와 같았다.

  • C++에서 문자(char형)는 ASCII(아스키 코드) 값으로 저장됨
  • '0' --> 48, '1' --> 49, ... 등과 같이 숫자로 전환되어 저장됨
  • 문자로 사용하기 위하여, 아래와 같이 코드 블록 작성
ary[chr-'0']++;

-'0' ???

문자 '5'의 ASCII 값이 53일 때, '0'의 ASCII 값인 48을 빼면 5라는 값이 나오게 되며,

사용하고자하는 숫자 5를 도출해낼 수 있게 된다.

그래서 우리는 '0'을 빼주어야 한다.

 

 

 

이제 마지막 단계.

 

(1) for 문을 통하여 배열 ary의 모든 요소를 처음부터 끝까지 하나씩 가져와 nums에 저장

for(int nums : ary){
        
}

 

(2) 저장된 배열 요소 출력

cout << nums << '\n';

 

 

 

전체 코드

#include <iostream>
#include <string>

//숫자의 개수
using namespace std;

int main(){
    int a,b,c;
    cin >> a >> b >> c;

    int mul;
    mul = a*b*c;
    
    string mulStr = to_string(mul);

    int ary[10] = {};
    
    for(char chr : mulStr){
        ary[chr-'0']++;
    }

    for(int nums : ary){
        cout << nums << '\n';
    }
    return 0;
}

 

 

 

 

 

브론즈2 난이도의 문제였지만,

바로 풀이가 떠오르지 않았던 문제.

혼자 고민하다 기본 개념부터 함수 활용까지

여러 블로그를 많이 참고하였다.

 

문자형 변환이 아직 어려운 것 같다.

 

 

 

 

 

더 좋은 풀이가 있다면 댓글로 알려주세요 !!

피드백 환영입니다☺️

728x90