본문 바로가기
PS 문제 풀이/Jungol

[Jungol] 정올 3109 숫자 야구2

by 까망 하르방 2021. 2. 27.
반응형

출처: http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=2391&sca=50&page=21

① "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

댓글