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);
}
추가 내용
일단 아주 만족스러웠던 코드.
-
~scanf를 통해서 입력받을 때까지만 loop를 돌리는 현명한 코드를 짰다.
-
원래 단순하게 생각하면 나머지만 저장하는 10자리 배열을 만들고 거기서 중복 검사를 하는 (이중 루프) 걸 떠올리는데 나는 여기서 42사이즈(%42)배열을 만들어서 그냥 x[N%42]꼴을 취하면 이중 loop를 취하지 않아도 !=0인지만 검사하면 빠르게 처리할 수 있을 것 같았다.
*이전에 Q21093912에서 발상을 얻었다.
총평
만족스럽게 잘 풀었다. 다만 두번째 while문을 int i 선언 없이 좀 더 깔끔하게 다듬어보고 싶다. 아주 사소하므로 일단 패스.