본문 바로가기
Beakjoon&프로그래머스/Java

[백준/Java] 28682번 재우야 임관하자

by 현장 2026. 1. 27.

-Code

import java.io.*;
import java.util.*;

public class BOJ28682 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());
        // 하나로 질문을 통일하게 되면
        // 채점기는 각 과목당 남은 두 가지 중 정답이 아닌 것을 우리에게 반환
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < n; i++) {
            sb.append("swimming ");
        }
        // 값 넘기기
        System.out.println(sb);
        System.out.flush();
        // 반환된 결과 받기
        String[] answer = br.readLine().split(" ");
        sb = new StringBuilder();
        for (int i = 0; i < n; i++) {
            // 해당 원소가 아닌게 정답
            if (answer[i].equals("bowling")) {
                sb.append("soccer ");
            } else {
                sb.append("bowling ");
            }
        }
        System.out.println(sb);
        System.out.flush();
    }
}

인터렉티브 문제를 풀어본 경험이 적어서 많이 찾아보았고, 이 게임의 룰은 간단히 말해 이렇습니다:

  1. 내가 먼저 모든 과목에 대해 swimming 또는 bowling을 외칩니다.
  2. 채점기는 내가 외친 과목이 아닌 것 중 하나를 "싫어!"라고 대답합니다.
  3. 나는 채점기가 말하지 않은 나머지 하나를 선택하면 무조건 정답이 됩니다.

즉, 첫 입력을 하나로 통일하면 다음과 같은 이점이 생긴다는 것을 힌트로 받아서 해결했습니다. 이 게임은 세 가지 선택지(수영, 볼링, 축구) 중 하나가 정답인 상황입니다.

✅ 정보의 단순화

내가 모든 과목에 대해 수영을 외쳤다고 가정해 봅시다. 그러면 채점기는 각 과목당 남은 두 가지(볼링, 축구) 중 정답이 아닌 것을 우리에게 알려줍니다.

  • 채점기가 "bowling"이라고 반환하면, 정답은 "soccer"입니다.
  • 채점기가 "soccer"이라고 반환하면, 정답은 "bowling"입니다.

위와 반대로 만약 내가 1번 과목은 수영, 2번 과목은 볼링 이런 식으로 섞어서 내면, 채점기의 대답을 해석하는 if문이 훨씬 복잡해집니다. 하지만 하나로 통일하면 "내가 안 낸 두 개 중에 채점기가 말 안 한 게 정답"이라는 아주 단순한 로직 하나로 N개를 다 처리할 수 있습니다.