반응형
출처: http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=2391&sca=50&page=21
[BOJ] 2503 숫자 야구 문제와 달리 비교되는 숫자가 주어지지 않습니다.
① "1234"를 query에 보내고 결과 확인
4 strike이면 게임 종료
그렇지 않다면 그 기록을 저장해 대전 기록으로 활용해야 합니다.
② 대전 기록을 통과하는 아직 검토해보지 않은 수를 선택해서 query에 보내 결과를 받습니다.
이러한 과정을 4 strike가 나올 때까지 대전기록을 누적해갑니다.
// *** user.cpp ***
#ifdef _WIN32
#define ACTIVE 1
#else
#define ACTIVE 0
#endif // __WIN32
#if ACTIVE
typedef struct Data {
int strike;
int ball;
} Data;
#endif // ACTIVE
int* candi, N, A[5042][6];
extern Data query(int *supose);
bool isOK(int num) {
int i, j, s, b;
int used[10] = { 0 };
for (j = 3; j >= 0; --j) {
int r = num % 10;
// 중복되지 않은 숫자로 candi[]에 저장
if (used[r]) return false;
used[r] = 1, candi[j] = r;
num /= 10;
}
// 기존 대전기록과 비교 검증
for (i = 0; i < N; ++i) {
s = b = 0;
for (j = 0; j < 4; ++j) {
// 위치가 같으면서, 숫자가 동일한 경우
if (A[i][j] == candi[j]) s++;
// 위치가 다르면서, 숫자가 동일한 경우
else if (used[A[i][j]]) b++;
}
if (A[i][4] != s || A[i][5] != b)
return false;
}
// 기존 대전 기록 검증을 통과하여 query()에 던져봅니다.
Data res = query(candi);
// 4 strike인 경우 종료하며, 그렇지 않으면 대전기록으로 누적
if (res.strike == 4)
return true;
for (j = 0; j < 4; ++j)
A[N][j] = candi[j];
A[N][4] = res.strike; A[N][5] = res.ball;
N++; // 대전 기록 개수를 늘려갑니다.
return false;
}
void tryBest(int *suppose) {
candi = suppose;
N = 0;
for (int i = 123; i <= 9876; ++i) {
if (isOK(i)) return;
}
}
반응형
'PS 문제 풀이 > Jungol' 카테고리의 다른 글
[Jungol] 정올 1462 보물섬 (2) | 2021.02.27 |
---|---|
[Jungol] 정올 3008 교통수단 선택하기 (0) | 2021.02.27 |
[Jungol] 정올 3031 인형정리 (0) | 2021.02.27 |
[Jungol] 정올 2217 DNA 조합 (0) | 2021.02.27 |
[Jungol] 정올 1180 Dessert (0) | 2021.02.27 |
댓글