728x90

문제

세 개의 자연수 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

 

출처

Olympiad > 한국정보올림피아드 > 한국정보올림피아드시․도지역본선 > 지역본선 2006 > 초등부 2번

  • 문제의 오타를 찾은 사람: pineapple
  • 잘못된 데이터를 찾은 사람: tncks0121

 

알고리즘 분류

  • 수학
  • 구현
  • 사칙연산

 

문제 출처

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

 

2577번: 숫자의 개수

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

www.acmicpc.net

 


 

문제 해결 방법

  • 크기가 10이고, 값이 0인 1차원 배열 digit을 생성한다. 이 배열은 입력 받은 세 정수를 곱한 값(timesNum)의 각 자릿수의 위치에 있는 값들의 개수를 나타내는데 사용할 것이다.
    • digit 배열의 각 인덱스는 0~9까지 있으며, 값을 모두 0으로 초기화한다. 
      • digit[10] = { 0 }
  • timesNum 값의 일의 자리에 있는 값을 digit 배열의 인덱스로 사용할 것이다. 반복문을 이용하여 timesNum 변수의 끝 자릿수부터 맨 앞 자릿수까지 순회를 하며 digit 배열의 해당 인덱스의 값을 증가시켜준다.
    • timesNum의 일의 자리 수는 % 연산자를 이용하여 구하고 tmp 변수에 할당한다.
      • tmp = timesNum % 10
    • digit 배열의 tmp 인덱스에 있는 값을 1만큼 증가시킨다.
      • digit[tmp]++
    • timesNum 값의 일의 자리의 값을 구했으니 이제 맨 마지막 자리를 잘라준다. 
      • timesNum /= 10
    • timesNum의 값이 0이 될 때까지 위의 과정들을 반복해준다.
      • while (timesNum != 0) { }

 

코드

#include <iostream>
using namespace std;

int main() {
    cin.tie(NULL);
    cout.tie(NULL);
    ios_base::sync_with_stdio(false);

    int A, B, C, timesNum, tmp, digit[10] = { 0 };

    cin >> A >> B >> C;

    timesNum = A * B * C;

    while (timesNum != 0) {
        tmp = timesNum % 10;    // extract the last digit.
        digit[tmp]++;
        timesNum /= 10;    // cut the last digit every loop.
    }

    for (int n : digit) {
        cout << n << '\n';
    }

    return 0;
}

 

채점 결과

 

참고

  • [단계별로 풀어보기] > [1차원 배열]

 

숫자 다루기

  • 숫자를 뒤에서 부터 하나씩 자를 때는 num / 10 연산을, 마지막 자리의 값을 추출하려면 num % 10 연산을 사용한다.
728x90

'Problem Solving > BOJ' 카테고리의 다른 글

[BOJ-4344][C++] 평균은 넘겠지  (0) 2022.07.10
[BOJ-8959][C++] OX퀴즈  (0) 2022.07.10
[BOJ-1546][C++] 평균  (0) 2022.07.10
[BOJ-3052][C++] 나머지  (0) 2022.07.10
[BOJ-2562][C++] 최댓값  (0) 2022.07.10
[BOJ-10818][C++] 최소, 최대  (0) 2022.07.10
[BOJ-1110][C++] 더하기 사이클  (0) 2022.07.09
[BOJ-10951][C++] A+B - 4  (0) 2022.07.09