본문 바로가기

BAEKJOON/수학

백준 2577번 [숫자의 개수](C++)-yes6686- 티스토리

728x90
SMALL

백준 문제 풀이: 2577 [숫자의 개수]


문제 링크: https://www.acmicpc.net/problem/2577

문제 설명:

세 개의 자연수 A, B, C가 주어집니다. 이 세 수를 곱한 결과에서 0부터 9까지의 숫자가 각각 몇 번 쓰였는지 구하는 프로그램을 작성하세요.

입력 조건:

  • 첫째 줄부터 세 줄에 걸쳐 자연수 A, B, C가 주어집니다. (100 ≤ A, B, C < 1,000)

출력 조건:

  • 첫째 줄부터 열 번째 줄까지 각 숫자가 결과에서 몇 번 쓰였는지를 출력합니다.

문제 해결 코드


#include <iostream>
using namespace std;

int main() {
    int arr[10] = {0}; // 0부터 9까지 숫자의 개수를 저장하는 배열
    int a, b, c;
    cin >> a >> b >> c;

    int num = a * b * c; // 세 자연수의 곱

    // 각 자리 숫자 세기
    while (num > 0) {
        arr[num % 10]++; // 마지막 자리 숫자를 세고
        num /= 10;       // 숫자를 한 자리 줄임
    }

    // 결과 출력
    for (int i = 0; i < 10; i++) {
        cout << arr[i] << endl;
    }

    return 0; // 프로그램 정상 종료
}

코드 설명

위 코드는 세 자연수의 곱에서 각 숫자가 몇 번 쓰였는지를 계산하고 출력합니다.

  • 배열 초기화:
    • `arr[10]` 배열을 0으로 초기화하여 각 숫자의 개수를 저장합니다.
  • 숫자 세기:
    • 주어진 숫자를 10으로 나눈 나머지를 이용하여 마지막 자리를 추출합니다.
    • 해당 숫자의 개수를 배열에 추가한 뒤, 숫자를 10으로 나눠 자릿수를 줄입니다.
    • 이 과정을 숫자가 0이 될 때까지 반복합니다.
  • 결과 출력:
    • 0부터 9까지 각 숫자의 개수를 순서대로 출력합니다.

시간 복잡도 분석:

  • 숫자의 자릿수만큼 반복하므로 O(log₁₀(num)).
  • 배열 초기화와 결과 출력은 O(10).

따라서 전체 시간 복잡도는 O(log₁₀(num))입니다.


결과

다음은 입력 예시와 출력 결과입니다:

입력:
150
266
427

출력:
3
1
0
2
0
0
0
2
0
0

위 입력에서는 세 수를 곱한 결과 150 * 266 * 427 = 17037300에서 숫자들의 개수를 계산합니다.

다른 접근 방식이나 개선 사항이 있다면 댓글로 공유 부탁드립니다!

728x90
LIST