BOJ 2577

 

우선 이 문제 풀이를 시작하기에 앞서 사용한 함수 한개에 대해 설명해드리겠습니다. int type 변수를 string type으로 변환하는 함수입니다. string.h 헤더파일에 있으며, string.h를 참조를 해주어야 사용할 수 있습니다.

- to_string(int type) : 전달 매개 변수 안에 int type의 값을 넣게 되면 return값으로 string type이 나오게 됩니다. 이 방법 외에도 sprintf라는 함수를 사용하면 int형으로 변환할 수 있지만 sprintf의 경우 전달 매개 변수 값이 char type의 배열이어야 한다는 점입니다. string은 char 배열보다 사용이 간편한 장점이 있기 때문에 to_string함수를 사용했습니다. 이 방법 외에도 나눗셈과 나머지 연산을 활용하여 변환하는 알고리즘을 설계하는 방법도 있습니다.

이제 문제 풀이를 해봅시다. 가장 먼저 A와 B와 C라는 세 값을 입력받아 곱한 결과값을 받아옵니다. 이제 여기서부터 문제가 시작인데 물론 곱한 결과값인 int형을 가지고 풀이를 진행할 수 있지만, 문자열로 변환하여 풀어보는 것이 훨신 간단하여 그 방법으로 풀어보았습니다. 가장 먼저 곱한 결과값을 string type으로 변환해야하는데 위에서 설명한 함수를 활용하면 간단하게 한줄만에 변환을 할 수 있습니다. 그렇게 변환한 stirng 변수를 이용해 각 자리수의 숫자의 개수를 측정할 것입니다. 방법은 아주 간단합니다. 변환된 string 변수를 첫번째 자리부터 끝까지 탐색을 하면서 숫자를 측정하면 되는데 이 과정속에서 아스키 코드를 활용할 것입니다. 0~9까지의 숫자의 개수를 측정할 int type의 배열 num을 만든 뒤 for문을 이용해 곱한 결과값을 string으로 바꾼 문자열을 탐색할 것입니다.

첫번째 자리의 문자열을 탐색했을때 1~9사이의 문자가 나올 것입니다. 이것을 아스키코드 값만큼 빼주게 되면 int type으로 쉽게 변환할 수 있습니다. 그 값을 num의 index에 넣어주고 그 값에 1을 더해주면 됩니다.

가장 쉬운 예로 설명을 하자면, 만약 곱셈의 결과가 329라고 했을때 앞자리부터 탐색을 시작합니다. 가장 첫번째 오는 문자는 '3'일겁니다. 여기서 '0'의 아스키코드 값만큼 빼주게 되면, '3'의 아스키값은 51이고 '0'의 아스키값은 48입니다. 그렇기 때문에 51-48 = 3이 나오게 됩니다. 이렇게 int type의 값으로 바꾸어 num 배열의 index에 넣어주게 되면, num[3]++이 될 것입니다. 그럼 현재 num 배열은 생성 초기에 0으로 초기화를 해주었다는 가정하에 아래의 표와 같이 저장이 될 것입니다.

0

1

2

3

4

5

6

7

8

9

0

0

0

1

0

0

0

0

0

0

다음 과정을 진행하면 329에서 3까지 탐색했으니 2의 문자열을 처리할 것입니다. 위와 동일하게 '2'에서 '0'의 계산을 해주면, 아스키 값으로 봤을때, 50-48 = 2로 num[2]++의 과정을 거치게 될것입니다. 그럼 num에 저장된 값을 확인해보면 아래와 같을 것입니다.

0

1

2

3

4

5

6

7

8

9

0

0

1

1

0

0

0

0

0

0

이렇게 반복하다보면 최종적으로는 아래의 표와같이 나올것입니다.

0

1

2

3

4

5

6

7

8

9

0

0

0

1

0

0

0

0

0

1

그럼 이 결과값을 그대로 for문을 이용하여 한줄한줄 출력해주면 문제가 해결이 됩니다.


* Key point

1. 곱셈의 결과값을 string type으로 변환

2. 문자열을 탐색하면서 아스키 값만큼 빼주어 num 배열 index에 넣어줌

3. 해당 배열 값을 1만큼 증가시켜줌


#include <iostream>
#include <string>

using namespace std;

void solution(int sum) {
	string str;
	int num[10] = { 0, };       // 0 ~ 9까지 각 자리수의 개수를 기록하는 변수

	str = to_string(sum);       // int type의 변수를 string type으로 바꿔주는 변수

	for (int i = 0; i < str.length(); i++)
		num[str[i] - '0']++;    // 곱셈 결과 값을 맨 앞자리부터 탐색하면서 개수를 세는 과정
	
	for (int i = 0; i < 10; i++)
		printf("%d\n", num[i]);     // 결과 값 출력

}
int main() {
	int A, B, C;
	int sum;

	scanf("%d %d %d", &A, &B, &C);

	sum = A * B * C;

	solution(sum);
}

결과창
채점 결과

+ Recent posts