나머지
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; }