celina의 이것저것

[C++] 백준 2577번 - 숫자의 개수 본문

자료구조&알고리즘/백준

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

celinayk 2023. 3. 5. 21:40
반응형

문제

세 개의 자연수 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. a,b,c 숫자를 입력받다
2. 일단 다 곱해 
3. 곱한 그 값을 string으로 변환하자
4. string을 반복문 돌면서

5. 각 숫자가 몇번 잇는지 카운팅

이렇게 순서대로 코드를 짰다. 값을 string으로 변환 해야겠다고 생각한 이유는 곱한 값을 싹다 돌면서 각 숫자가 몇번 쓰였는지 확인해야하는데 한자리씩 따로 체크를 해야하니까 string형으로 변환하는게 낫다는 생각이 들었다 

코드

#define _CRT_SECURE_NO_WARNINGS
#include <iostream> 
#include <algorithm>
#include <string>
#include <vector>
using namespace std;

int main() {

    string n[10] = { "0","1","2","3","4","5","6","7","8","9" };
    int cnt[10] = { 0, };

    int a, b, c;
    scanf("%d %d %d", &a, &b, &c);

    int x=a*b*c;
    string num = to_string(x);

    for (int i = 0; i < num.size(); i++) {
        for (int j = 0; j < 10; j++) {
            if (num[i] == n[j][0]) {
                cnt[j]++;
            }
        }
    }

    for (int i = 0; i < 10; i++) {
        cout << cnt[i] << endl;
    }

    return 0;
}

리뷰

to_string함수를 사용해서 int형에서 string형으로 변환을 했다

그리고 for문을 사용했다. 미리 string형의 배열에 0부터 9까지 숫자를 담아두고 비교를 해야겠다고 생각했다 여기서 고민을 했는데 어떻게 비교를 해야하지?였다

if문으로 num[i] == 0 , num[i] == 1 ,,, 이렇게 하기엔 코드가 너무 길고 쓸데 없어져서 고민했다..

아 그리고 몇번 출력되는지 횟수를 카운팅하는 배열도 만들었다 그래야 마지막에 출력할때 배열을 반복문으로 돌면서 출력하면 되니까

하여튼 젤 중요한 비교를 하는 코드를 생각하는게 어려웟다 ㅜㅜ

안쪽에 반복문을 하나 더 만들어서 바깥반복문은 num문자열을 순환하면서 안쪽반복문을 돌때 해당하는 숫자가 몇번있는지 카운팅한다. 

일케 그림 그리니까 바로 이해완. 별찍기할때부터 이중반복문은 뭔가 어려웠음....ㅎ...

 

그리고 if문으로 비교할 때 n[j][0]뒤에 [0]이 있는데 이게 없으면 컴파일에러가 난다...ㅎ

왜냐하면 문자열을 비교하는게 아니라 문자열의 주소값을 비교하니까(개어렵네....)

 

이렇게 하면 n배열에서 j번째 문자열 전체를 가져오게 된다 하지만 n배열에 저장된 문자열이 모두 한자리 숫자니까 문자열의 첫번째 문자만 쓰면 된다 

예를 들어 j==0일때 n[0]은 0이라는 문자열을 저장하고 있고 n[0][0]은 0문자를 나타낸다 그래서 쓰는것이다

 

n[j]는 j번째 숫자에 해당하는 문자열을 저장하는 배열

n[j][0]는 n배열에서 j번째 문자열의 첫번째 문자를 나타낸다

만약 [1]이 된다면 문자열의 두번째문자를 나타낸다

 

하 이거 이해하는데 좀 시간 걸림... 

출처 

2577번: 숫자의 개수 (acmicpc.net)

 

Comments