Bakjoon Q21093912 - C++

Q21093912


Problem

세 개의 자연수 A, B, C가 주어질 때 A × B × C를 계산한 결과에 0부터 9까지 각각의 숫자가 몇 번씩 쓰였는지를 구하는 프로그램을 작성하시오.

예를 들어 A = 150, B = 266, C = 427 이라면 A × B × C = 150 × 266 × 427 = 17037300 이 되고, 계산한 결과 17037300 에는 0이 3번, 1이 1번, 3이 2번, 7이 2번 쓰였다.

Input

첫째 줄에 A, 둘째 줄에 B, 셋째 줄에 C가 주어진다. A, B, C는 모두 100보다 크거나 같고, 1,000보다 작은 자연수이다.

Output

첫째 줄에는 A × B × C의 결과에 0 이 몇 번 쓰였는지 출력한다. 마찬가지로 둘째 줄부터 열 번째 줄까지 A × B × C의 결과에 1부터 9까지의 숫자가 각각 몇 번 쓰였는지 차례로 한 줄에 하나씩 출력한다.

예제 입력

1
2
3
150
266
427

예제 출력

1
2
3
4
5
6
7
8
9
10
3
1
0
2
0
0
0
2
0
0

참고 제출

1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>
int a,b,c,x[10],i;
main(){
	scanf("%d%d%d",&a,&b,&c);
	a*=b*c;
	while(a){
		x[a%10]++;
		a/=10;
	}
	for(i=0;i<10;i++)printf("%d\n",x[i]);
}

추가 내용

일단 풀긴 풀었으나, 코드가 너무 난잡하고 단순하게만 생각한 결과물이어서 다른 답안을 충분히 이해한 이후에 코드를 긁어왔다.

처음 문제를 풀 때 사고 방식

  1. 먼저 입력을 받자
  2. 그 입력을 문자화시키자
  3. 문자 각각을 if문으로 비교해서 정답 배열에 ++시켜서 세야겠다!

여기서 if문으로 각각 비교시킬때 코드가 엄청나게 길어지고 메모리도 많이 먹는다. 따라서 (현실적인 선에서)참고한 코드는 위와 같다.

  1. 전역배열 x[10]를 선언하면 자연적으로 0으로 초기화된다.
  2. a에 세 수의 합을 저장한다.
  3. 수열 x[]에 a를 10으로 나눈 나머지(즉 맨 끝자리수)를 센다. ex) 167이면 x[7]에 ++ 하는것 / x[0]은 0개수 이런식으로 반복됨
  4. a를 10으로 잘라 일의 자리수를 떼어낸다. - 반복 until a=0; a = 한자리수 / 10 하면 0.x = 0으로 귀결됨

총평

루프를 돌리면 돌릴수록 메모리를 하마마냥 어마어마하게 잡아먹기 때문에 최대한 깔끔한 방법을 고민해볼 필요가 있다는 걸 알게해준 문제.