문제
시훈이와 동현이는 기밀자료를 다루는 연구기관의 관리자입니다.
연구기관은 자료의 등급에 따라 여러 단계의 보안시스템을 통과해야 자료에 접근할 수 있습니다.
가장 중요한 자료는 시훈이와 동현이만 접근할 수 있습니다.
가장 중요한 자료인 일급비밀에 대한 보안 시스템을 고민하던 시훈이와 동현이는 필요로 하는 요구사항을 정리해 보기로 하였습니다.
1. 시훈이와 동현이는 함께 또는 각각 보안시스템을 통과할 수 있어야 합니다.
2. 시훈이가 암호를 걸어도 동현이가 풀 수 있어야 하고, 동현이가 암호를 걸어도 시훈이가 풀 수 있어야 합니다.
3. 자료에 빈번하게 접근해야 하므로 질문과 응답이 빠르게 이루어져야 합니다.
고민을 거듭하여 두 사람은 다음과 같은 시스템을 만들었습니다.
1. 시스템은 두 자연수 x, y (1<= x, y <= 920, x ≠ y)를 관리자에게 제시하여 하나의 자연수로 암호화 하도록 요구합니다.
이 기능을 하는 함수를 encoding(x, y)라고 정의하고 이 함수는 암호화된 수 k ( 1 <= k ) 를 반환합니다.
시스템은 두 자연수 x, y, k에 대한 정보를 보관합니다.
2. 일급기밀자료에 접근을 요구하는 경우 위 1번의 정보를 기초로 시스템은 가지고 있는 정보 중에 임의의 두 자연수 p, k를 제시합니다.
이때 접근을 요구한 사람은 p가 x라면 ‘x‘를 y라면 ’y‘라고 응답해야 보안시스템을 통과할 수 있습니다.
그렇지 않다면 경보가 울립니다.
이 기능을 하는 함수를 answer(p, k)라고 하고 ‘x’또는 ‘y’를 반환합니다.
3. 위 1 또는 2번 질문을 최대 2,000,000번 할 수 있으며 이를 통과해야 일급비밀자료에 접근할 수 있습니다.
[해야 할 일]
아래 제약사항과 채점 기준에 맞도록
encoding(int x, int y); 함수와
char answer(int p, int k); 함수를 작성 합니다.
[제약사항]
sample code를 를 다운로드 합니다.
두 개의 코드 샘플은 사용자가 작성해야 하는 코드의 예를 나타내는 것 뿐입니다.
올바른 정답을 보여주지 않을 수 있습니다.
또한 채점을 위한 파일은 manager.cpp의 내용과는 다릅니다.
사용자는 mysolution.cpp파일에 [해야 할 일]에서 주어진 두 개의 함수를 작성합니다.
[제한사항]
주어진 메모리 범위에서 전역 및 static변수를 사용할 수 있다.
[C, C++ template code]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | /* Template Code */
/// *** mysolution.cpp *** int encoding(int x, int y) {
} char answer(int p, int k) {
}
/// *** manager.cpp *** #include <stdio.h>
extern int encoding(int x, int y); extern char answer(int q, int h);
static int score() { int krr[5] = { 0 }, max_k = 0; int scoreTable[] = { 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 75, 60, 50, 42, 34, 33, 30, 27, 0 };
krr[0] = encoding(1, 2); if (krr[0] <= 0) return 0; if (answer(1, krr[0]) != 'x') return 0;
krr[1] = encoding(4, 5); if (krr[1] <= 0) return 0;
if (answer(2, krr[0]) != 'y') return 0;
if (answer(4, krr[1]) != 'x') return 0;
krr[2] = encoding(5, 2); if (krr[2] <= 0) return 0;
if (answer(2, krr[2]) != 'y') return 0;
for (int i = 0; i < 3; ++i) { if (max_k < krr[i]) max_k = krr[i]; }
if (max_k >= 21) max_k = 21; return scoreTable[max_k]; }
int main() { printf("%d", score()); return 0; }
|
예제
Function Call | Returns |
encoding(1,2) | 12 |
answer(1,12) | x |
encoding(4,5) | 2 |
answer(2,12) | y |
answer(4,2) | x |
encoding(5,2) | 1 |
answer(2,1) | y |
[채점 기준]
여러분 프로그램의 점수는 모든 x, y 에 대해 encoding(x, y) 가 return 하는 최대 k값으로 결정된다.
또한 answer(p, k) 의 return 값이 모두 정확하게 맞아야 한다.
그렇지 않은 경우 0점으로 처리된다.
최대 k | 점수 |
>= 21 | 0 |
20 | 10 |
19 | 20 |
18 | 30 |
17 | 40 |
16 | 50 |
15 | 60 |
14 | 70 |
13 | 80 |
<=12 | 100 |