본문 바로가기

문제 풀이/문제 풀이(BOJ)

[Silver V] 숫자 맞추기 게임 - 4335

[문제 위치]

https://www.acmicpc.net/problem/4335

[문제 풀이]

이 문제는 범위 갱신을 통한 시뮬레이션 문제이다.

스탠은 어떤 수를 불러 보고, 상대는 “too high”, “too low”, “right on”으로 대답한다. 스탠이 정직했다면:

  • “too high”라고 했을 때 실제 정답은 그 수보다 작아야 하고,
  • “too low”라고 했을 때 실제 정답은 그 수보다 커야 한다.

따라서 각 판마다 가능한 정답 범위를 low와 high로 유지한다.

  • “too low” → low = max(low, guess+1)
  • “too high” → high = min(high, guess-1)
  • “right on” → 마지막 수가 [low, high] 범위에 들어가면 정직, 아니면 거짓말.
    이때 한 게임이 끝나면 범위를 초기화해야 한다.
#include <bits/stdc++.h>
using namespace std;

#define fastio ios::sync_with_stdio(false); cin.tie(nullptr);

int main() {
    fastio;
    int guess;
    int low = 1, high = 10; // 처음 범위
    while (true) {
        cin >> guess;
        if (guess == 0) break;
        string w1, w2;
        cin >> w1 >> w2; // "too" or "right", "low/high/on"
        if (w2 == "low") {
            low = max(low, guess + 1);
        } else if (w2 == "high") {
            high = min(high, guess - 1);
        } else if (w2 == "on") {
            if (guess >= low && guess <= high) {
                cout << "Stan may be honest\n";
            } else {
                cout << "Stan is dishonest\n";
            }
            // 게임 종료 후 범위 초기화
            low = 1; high = 10;
        }
    }
    return 0;
}