티스토리 뷰

PS 이야기/PS - BOJ

[BOJ] 2577번 - 숫자의 개수

whatisyourname 2022. 4. 3. 01:13
반응형

https://www.acmicpc.net/problem/2577

 

2577번: 숫자의 개수

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

www.acmicpc.net

문제

세 개의 자연수 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초 / 메모리 제한 : 128MB


1. 어떻게 풀까?

1-1) 숫자의 개수를 세는 방법은 여러가지가 있다.

세 자연수 A, B, C 모두 1000보다 작은 자연수이므로, 세 숫자의 곱은 최대 10억까지의 자연수이다.

따라서, int형에 결과를 담는데 무리가 되지 않는다.

 

다음으로, 0부터 9까지의 숫자를 담을 배열을 설정한다. 각 배열의 초기값은 0으로 한다.

이후 마지막 한 자리씩 끊어서 각 숫자에 해당하는 배열의 값을 하나씩 올려준다.

 

1
2
3
4
5
6
7
int table[10] = {0, };
 
while (result > 0){
    temp = result % 10;
    table[temp]++;
    result /= 10;
}
cs

변수 result가 A, B, C의 곱이라 할 때, 한 자리씩 뽑는 방법은 위와 같다. 세 단계로 이루어져 있다.

0. result가 0이거나 0보다 작으면 종료한다.

1. 변수 temp에 result의 일의 자리 수를 담는다.

2. temp에 해당하는 배열의 값을 1만큼 올려준다.

3. result에 result를 10으로 나눈 몫을 저장한다.

1부터 3까지의 과정을 거치면 모든 자리의 숫자의 개수를 셀 수 있다.

 

혹은, result를 string으로 다룬다면 다음과 같이 다룰 수 있다. (C++ 14부터 사용 가능)

 

1
2
3
4
5
int table[10= {0, };
 
for (char ch: to_string(result)) {
    table[ch - '0']++;
}
cs

 

C++ 14부터 지원되는 python 비슷한 모양의 for문을 통해, result을 string형으로 변환한 다음, 각 숫자에 해당하는 table의 크기를 1만큼 증가시켜준다. 이때, 임시 변수는 char형이기에 index에 넣어줄 때는 (ch - '0')을 하여서 int형으로 바꾸어 주어야 한다.

 

마지막으로, 각 table에 해당하는 숫자를 출력해주면 맞았습니다! 를 받을 수 잇다.

2) 최종 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <bits/stdc++.h>
using namespace std;
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
 
    int A, B, C, temp;
    cin >> A >> B >> C;
    int result = A * B * C;
    int table[10= {0, };
 
    while (result > 0){
        temp = result % 10;
        table[temp]++;
        result /= 10;
    }
 
    for (int i = 0; i < 10; i++){
        cout << table[i] << "\n";
    }
    return 0;
}
cs
반응형

'PS 이야기 > PS - BOJ' 카테고리의 다른 글

[BOJ] 2739번 - 구구단  (0) 2022.04.03
[BOJ] 2675번 - 문자열 반복  (0) 2022.04.03
[BOJ] 2562번 - 최댓값  (0) 2022.04.03
[BOJ] 2557번 - Hello World  (0) 2022.04.03
[BOJ] 2475번 - 검증수  (0) 2022.04.02
댓글
Total
Today
Yesterday
공지사항
최근에 올라온 글
최근에 달린 댓글
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함