Bakjoon Q3052 - C++

Q3052


Problem

두 자연수 A와 B가 있을 때, A%B는 A를 B로 나눈 나머지 이다. 예를 들어, 7, 14, 27, 38을 3으로 나눈 나머지는 1, 2, 0, 2이다. 수 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다. 그 다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오.

Input

첫째 줄부터 열번째 줄 까지 숫자가 한 줄에 하나씩 주어진다. 이 숫자는 1,000보다 작거나 같고, 음이 아닌 정수이다.

Output

첫째 줄에, 42로 나누었을 때, 서로 다른 나머지가 몇 개 있는지 출력한다.

예제 입력

1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10

예제 출력

1
10

나의 제출

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include<string>
using namespace std;

int main(){
    int x[43]={};
    int n;
    int cnt=0;
    int i=0;
    while(~scanf("%d",&n)){
        x[n%42]++;
    }
    while(i++<43){
        if(x[i-1]!=0)
            cnt++;
    }
    printf("%d", cnt);
}

추가 내용

일단 아주 만족스러웠던 코드.

  1. ~scanf를 통해서 입력받을 때까지만 loop를 돌리는 현명한 코드를 짰다.

  2. 원래 단순하게 생각하면 나머지만 저장하는 10자리 배열을 만들고 거기서 중복 검사를 하는 (이중 루프) 걸 떠올리는데 나는 여기서 42사이즈(%42)배열을 만들어서 그냥 x[N%42]꼴을 취하면 이중 loop를 취하지 않아도 !=0인지만 검사하면 빠르게 처리할 수 있을 것 같았다.
    *이전에 Q21093912에서 발상을 얻었다.

총평

만족스럽게 잘 풀었다. 다만 두번째 while문을 int i 선언 없이 좀 더 깔끔하게 다듬어보고 싶다. 아주 사소하므로 일단 패스.