문제
정현이는 다음과 같이 동작하는 숫자 야구 프로그램을 만들었다.
* 프로그램은 0~9까지 10개의 수를 사용하여 4자리 수의 정답을 생성한다. 0으로 시작할 수 있다.
* 10개의 수는 한번씩만 사용되므로 정답에 중복된 수는 없다.
* 프로그램에게 임의의 4자리 수를 물어보면 프로그램은 그 수를 정답과 비교한 결과를 알려준다.
* 프로그램은 자리가 일치한 숫자는 strike,
정답에 포함되나 자리가 틀린 수를 ball로 판단하여 strike와 ball의 수를 알려준다.
따라서 정답을 맞췄을 경우 프로그램의 리턴값은 strike=4, ball=0 이다.
사용자 코드가 아래와 같이 주어질 때, 주어진 소스를 분석하여
프로그램에게 질의하는 query 함수를 최대한 적게(10번 이하) 호출하여 정답을 맞출 수 있도록 tryBest함수를 완성하시오.
* 질의는 query 함수를 사용하며 정답은 tryBest함수의 input parameter int suppose[] 배열에 저장한다.
* struct Result 와 함수 Result query(int suppose[]) 는 수정할 수 없다.
* 그 외 추가적인 전역변수나 함수는 사용 가능하다.
* 질의 수가 2,520을 초과하거나 1124 같은 잘못된 숫자를 질의했을 경우
프로그램은 strike=-1, ball=-1을 리턴한다.
[참고]
사용자 소스파일을 분리컴파일 하여 문제를 푸는경우
사용자는 아래 정의한 구조체를 사용자 소스 파일의 상단에 추가하여 코딩합니다.
// *** main.cpp ***
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define MAX 4
#define MAX_COUNT 2520
static int baseballNumbers[MAX];
static int numbersCheck[10];
extern void tryBest(int suppose[]); ////************
static int queryCallCount;
static const int queryLimit = 10;
struct Data {
int strike;
int ball;
};
static unsigned long long seed = 123;
int rand(void){
seed = seed * 1103515245 + 12345;
return (unsigned int)(seed >> 16) & 65535;
}
static bool isAble(int suppose[]) {
int supposeCheck[10];
for (int count = 0; count < 10; ++count)
supposeCheck[count] = 0;
for (int idx = 0; idx < MAX; ++idx) {
if (suppose[idx] < 0 || suppose[idx] >= 10 || supposeCheck[suppose[idx]] > 0)
return false;
supposeCheck[suppose[idx]]++;
}
return true;
}
Data query(int suppose[]) {
Data result;
if (queryCallCount > MAX_COUNT) {
result.strike = -1;
result.ball = -1;
return result;
}
queryCallCount++;
if (!isAble(suppose)) {
result.strike = -1;
result.ball = -1;
return result;
}
result.strike = 0;
result.ball = 0;
for (int idx = 0; idx < MAX; ++idx)
if (suppose[idx] == baseballNumbers[idx])
result.strike++;
else if (numbersCheck[suppose[idx]] > 0)
result.ball++;
return result;
}
static void initialize() {
for (int count = 0; count < 10; ++count)
numbersCheck[count] = 0;
for (int idx = 0; idx < MAX;) {
int c = rand() % 10;
if (numbersCheck[c] == 0) {
baseballNumbers[idx] = c;
numbersCheck[c]++;
idx++;
}
}
queryCallCount = 0;
}
static bool check(int suppose[]) {
for (int idx = 0; idx < MAX; ++idx) {
if (suppose[idx] != baseballNumbers[idx])
return false;
}
return true;
}
int main() {
int score = 100;
setbuf(stdout, NULL);
int sd = 123, TC = 50;
seed = sd;
for (int testcase = 1; testcase <= TC; ++testcase) {
initialize();
int suppose[MAX] = { 0 };
queryCallCount = 0;
tryBest(suppose);
if (!check(suppose))
queryCallCount = MAX_COUNT;
if (queryCallCount > queryLimit) {
score = 0;
break;
}
}
printf("%d\n", score);
return 0;
}
// *** user.cpp ***
struct Data {
int strike;
int ball;
};
extern Data query(int supose[]);
void tryBest(int suppose[]) {
}
출처
jungol