본문 바로가기
카테고리 없음

[백준] 2577. 숫자의 개수 <C++>

by 코드 이야기 2020. 9. 7.
728x90

www.acmicpc.net/problem/2577

 

2577번: 숫자의 개수

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

www.acmicpc.net

 

 

자릿수를 자르는 기본적인 알고리즘과, 배열 인덱스를 이용한 개수 세는 방법을 안다면 간단히 풀 수 있는 문제입니다.

 

 

자릿수를 자르는 기본적인 알고리즘부터 봅시다.

 

9876이라는 숫자가 있다면

 

9876 % 10 = 6

9876 / 10 = 987

 

987 % 10 = 7

987 / 10 = 98

 

98 % 10 = 8

98 / 10 = 9

 

9 % 10 = 9

9 / 10 = 0

 

0은 더 이상 연산할 수 없으므로 끝

 

> 자릿수 자르기 코드

  while(n) {
    n%10;
    n/=10;
  }

 

 

배열 인덱스를 이용한 개수 세는 방법을 봅시다.

 

아까 잘라놓은 6, 7, 8, 9로 예시를 들어볼게요.

 

<기본 상태>

숫자의 개수: 0 0 0 0 0 0 0 0 0 0 

각 숫자:       0 1 2 3 4 5 6 7 8 9

 

<6의 개수를 센 후>

숫자의 개수: 0 0 0 0 0 0 1 0 0 0

각 숫자:       0 1 2 3 4 5 6 7 8 9

 

<7의 개수를 센 후>

숫자의 개수: 0 0 0 0 0 0 1 1 0 0

각 숫자:       0 1 2 3 4 5 6 7 8 9

 

<8의 개수를 센 후>

숫자의 개수: 0 0 0 0 0 0 1 1 1 0

각 숫자:       0 1 2 3 4 5 6 7 8 9

 

<9의 개수를 센 후>

숫자의 개수: 0 0 0 0 0 0 1 1 1 1

각 숫자:       0 1 2 3 4 5 6 7 8 9

 

 

위의 자릿수 자르기와 개수 세는 것을 합치면 완성입니다.

 

#include <iostream>
using namespace std;

int main() {
  int a, b, c, n, num[10]{};
  cin >> a >> b >> c;
  n = a * b * c;

  while(n) {
    num[n%10]++;
    n/=10;
  }

  for(int i=0; i<10; i++)
    cout<<num[i]<<"\n";

}

 

 

 

+ 이 문제를 풀고 기수정렬에 대해 알아보면 좋을 것 같네요.

 

 

 

 

 

 

728x90

댓글