나머지
https://www.acmicpc.net/problem/2475
| 시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
|---|---|---|---|---|---|
| 1 초 | 128 MB | 149857 | 86517 | 72681 | 57.865% |
문제
두 자연수 A와 B가 있을 때, A%B는 A를 B로 나눈 나머지 이다.
예를 들어, 7, 14, 27, 38을 3으로 나눈 나머지는 1, 2, 0, 2이다.
수 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다.
그 다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오.
입력
첫째 줄부터 열번째 줄 까지 숫자가 한 줄에 하나씩 주어진다.
이 숫자는 1,000보다 작거나 같고, 음이 아닌 정수이다.
출력
첫째 줄에, 42로 나누었을 때, 서로 다른 나머지가 몇 개 있는지 출력한다.
예제 입력 1
1 2 3 4 5 6 7 8 9 10
예제 출력 1
10
예제 입력 2
42 84 252 420 840 126 42 84 420 126
예제 출력 2
1
예제 입력 3
39 40 41 42 43 44 82 83 84 85
예제 출력 3
6
각 수를 42로 나눈 나머지는 39, 40, 41, 0, 1, 2, 40, 41, 0, 1이다. 서로 다른 값은 6개가 있다.
출처
Contest > Croatian Open Competition in Informatics > COCI 2006/2007 > Contest #1 1번
알고리즘 분류
10개의 수를 입력받고 그 수 들을 % 42로 나눈 나머지를 구한다.
결과로 나온 나머지의 서로 다른 값들의 수를 구하는 문제
문제만 이해한다면 쉽게 구현할 수 있다.
나는 mod[나머지 값] 으로 저장한 후에
나중에 순회하면서 mod[x]의 값이 0보다 크다면 나머지가 존재한다는 뜻으로 카운트를 올려주었다.
통과된 코드
#include <iostream>
#include <list>
using namespace std;
int arr[10];
int mod[42];
int main()
{
int result = 0;
// 10개의 수를 입력 받습니다.
for (int i = 0; i < 10; i++) {
cin >> arr[i];
}
// mod[i] 는 나머지가 i인 경우 mod[i]에 ++ 로 추가합니다.
for (int i = 0; i < 10; i++) {
mod[arr[i] % 42] ++;
}
// mod[i] 가 0보다 크다면 나머지가 i인 경우의 수가 있다는 뜻이므로
// 결과 값을 증가 시켜줍니다.
for (int i = 0; i < 42; i++) {
if (mod[i] > 0) {
result++;
}
}
cout << result; //문제의 결과를 출력합니다.
return 0;
}


![백준 1504번 (특정한 최단 경로, C++, Dijkstra) / 추가 반례 [BAEKJOON]](https://lycos7560.com/wp-content/uploads/boj-og-1.png)
![백준 26005번 (나뭇잎 학회, C++) [BAEKJOON]](https://lycos7560.com/wp-content/uploads/2022/10/boj-og-1-2048x1070-1-1024x535.png)
