문제
1 ~ N까지의 정수 중에서 K개를 중복되지 않게 골라내어 임의의 순서로 나열한 수열 entry[]가 있다.
( 1000 <= N <= 100,000, N/2 <= K <= N)
이 수열에는 과연 어떤 수들이 포함되어 있을까?
사용자는 consistOf(int N, int K)함수에서 main.cpp에 선언된 countSameNumber(guess[]) 함수를 이용하여 entry[]배열에 대한 힌트를 얻을 수 있다.
countSameNumber(int guess[]) 함수는 guess[]에서 entry[]에 포함된 수가 몇번 등장하였는지 등장한 경우의 수를 반환한다.
자세한 것은 main.cpp 소스를 분석하여 알 수 있다.
예를 들어 N=7이고 K=5 라고 하자.
그리고 entry[] = {5, 1, 2, 7, 6}라고 하고 guess[] = {2, 2, 3, 1, 4}라고 하자.
이경우 countSameNumber(guess[]) 함수는 3을 반환한다.
또, guess[] = {7, 7, 7, 7, 7}이라고 하면 countSameNumber(guess[]) 함수는 5를 반환한다.
이제 main.cpp의 run()함수는 user.cpp의 isEntryNumber( int num )을 호출하여 num이 entry에 포함되어 있는지 질문한다.
isEntryNumber( int num )함수는 num이 entry에 대하며 포함되어 있다면 1을 그렇지 않다면 0을 반환한다.
[해야 할 일]
1. 하나의 프로젝트에 user.cpp파일과 main.cpp 두 개의 파일을 만들어 코딩하도록 한다.
2. user.cpp파일에는 필요하다면 추가적인 변수와 함수을 만들어 사용할 수 있으나 헤더파일을 포함할 수 없다.
3. user.cpp파일에 consistOf(int N, int K)와 isEntryNumber(int num)를 정의하여야 한다.
4. isEntryNumber(int num)는 최대 N번 호출될 수 있다.
5. 소스코드 제출시에는 user.cpp의 내용만 제출한다.
// main.cpp
#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif
#include <stdio.h>
extern void consistOf(int N, int K);
extern int isEntryNumber(int num);
const int MAX = 100000;
static int N, K, entry[MAX + 5];
static int appear[MAX + 5];
static int tCnt;
int countSameNumber(int guess[]) {
int cnt = 0;
for (int i = 0; i < K; ++i) {
if (guess[i] < 0 || guess[i] > MAX) return MAX;
cnt += appear[guess[i]];
}
return cnt;
}
static void input() {
scanf("%d %d", &N, &K);
for (int i = 0; i < K; ++i) {
scanf("%d", entry + i);
appear[entry[i]] ++;
}
}
static void run() {
consistOf(N, K); // 한번 호출
scanf("%d", &tCnt);
int num, response;
for (int i = 0; i < tCnt; ++i) {
scanf("%d", &num);
response = isEntryNumber(num);
printf("%d ", response);
}
puts("");
}
int main() {
freopen("input.txt", "r", stdin);
input();
run();
return 0;
}
// user.cpp
extern int countSameNumber(int guess[]);
void consistOf(int N, int K) {
}
int isEntryNumber(int num) {
return 0;
}예제
7 5
5 1 2 7 6
7
7 4 2 5 3 1 6
1 0 1 1 0 1 1