2019. 8. 5. 08:43ㆍ알고리즘/백준
문제
세 개의 자연수 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번 쓰였다.
입력
첫째 줄에 A, 둘째 줄에 B, 셋째 줄에 C가 주어진다. A, B, C는 모두 100보다 같거나 크고, 1,000보다 작은 자연수이다.
출력
첫째 줄에는 A×B×C의 결과에 0 이 몇 번 쓰였는지 출력한다. 마찬가지로 둘째 줄부터 열 번째 줄까지 A×B×C의 결과에 1부터 9까지의 숫자가 각각 몇 번 쓰였는지 차례로 한 줄에 하나씩 출력한다.
예제 입력 1
150
266
427
예제 출력 1
3
1
0
2
0
0
0
2
0
0
문제 풀이
#include<stdio.h>
int main() {
int A, B, C, N, size = 1;
scanf("%d\n%d\n%d", &A, &B, &C);
N = A * B * C;
do {
if (N / size > 0)
size *= 10;
else{
size /= 10;
break;
}
} while (1);
int arr[10] = { 0, };
while(1){
arr[(N / size) % 10]++;
size /= 10;
if (size < 1)
break;
}
for(int i = 0; i < 10; i++)
printf("%d\n", arr[i]);
}
N은 A * B * C의 결과 값입니다. 이 값은 코드가 끝나는 데까지 변하지 않습니다.
size 변수를 통해서 N의 각 자리 수 마다 값을 뽑아내서 숫자가 있을 때마다 무엇인가에다 +1씩 해주면 됩니다.
do while 문을 해석해 보면 N의 자리수가 10자릿수 이면 10의 9제곱까지 size 값을 곱하게 됩니다. 제일 높은 자리 수부터 숫자 뽑아내고 싶어서 그랬습니다.
두 번째 while 문 안에 있는 내용이 각 자리수를 뽑아내서 1씩 더하는 코드입니다. arr[(N / size) % 10]++ 코드를 보시면
0부터 9까지 인덱스 값을 구한 뒤, 해다 인덱스의 배열 값을 1씩 늘려주는 것이라는 것을 알 수 있습니다.
N / size 가 1이나 13, 52314 등 아무 숫자나 나와도 뒤에 있는 % 10 때문에 결국 1의 자리 수만 뽑아져서 arr 배열의 인덱스 값을 정상적으로 늘려 주는 것을 확인할 수 있습니다.
출처 : https://www.acmicpc.net/problem/2577
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 1546번 평균 C/C++ 문제 풀이 1차원배열 (0) | 2019.08.07 |
---|---|
[백준] 3052번 나머지 C++ 문제 풀이 1차원배열 (0) | 2019.08.06 |
[백준] 2920번 음계 C/C++ 문제 풀이 1차원배열 (2) | 2019.07.29 |
[백준] 2562번 최댓값 C++ 문제 풀이 1차원배열 (0) | 2019.07.26 |
[백준] 10818번 최소, 최대 C++ 문제 풀이 1차원배열 (0) | 2019.07.25 |