백준 Baby Bites

KIMYEONGJUN·2026년 1월 25일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

The first line of input contains an integer n (1 ≤ n ≤ 1 000), the number of bites Arild receives.
Then second line contains n space-separated words spoken by Arild, the i’th of which is either a non-negative integer ai (0 ≤ ai ≤ 10 000) or the string “mumble”.

If Arild’s counting might make sense, print the string “makes sense”.
Otherwise, print the string “something is fishy”.

내가 이 문제를 보고 생각해본 부분

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));:
콘솔(표준 입력)에서 데이터를 읽기 위한 BufferedReader 객체를 생성한다. 
System.in은 표준 입력 스트림을 나타내고, InputStreamReader는 바이트 스트림(System.in)을 문자 스트림으로 변환해 BufferedReader가 읽을 수 있도록 한다.
int n = Integer.parseInt(br.readLine());:
br.readLine()을 호출하여 첫 번째 줄(아릴드가 한 입 먹은 횟수 n)을 읽어온다. 
readLine()은 문자열을 반환하므로, Integer.parseInt()를 사용해 정수형으로 변환하여 n 변수에 저장한다.
StringTokenizer st = new StringTokenizer(br.readLine(), " ");:
두 번째 줄(아릴드가 말한 단어들)을 br.readLine()으로 읽어온다.
이 문자열을 new StringTokenizer(..., " ")를 사용하여 공백(" ")을 구분자로 각 단어를 분리할 준비를 한다.
st 객체를 통해 단어들을 하나씩 가져올 수 있다.
int expectedCount = 1;:
아릴드가 "논리적으로" 다음으로 말해야 할 숫자를 추적하는 변수이다. 
아릴드는 1부터 숫자를 세기 시작하므로, 초기값은 1이다.
boolean makesSense = true;:
아릴드의 카운트가 현재까지는 "논리적인" 상태인지를 나타내는 플래그(깃발) 변수이다. 
처음에는 논리적이라고 가정하고 true로 초기화한다.
만약 중간에 논리적인 오류를 발견하면 이 값을 false로 바꾸고 더 이상 진행할 필요 없이 결과를 결정할 수 있다.
for (int i = 0; i < n; i++) { ... }:
n번의 물린 횟수만큼 반복하는 for 루프이다. 
각 물림마다 아릴드의 말이 논리적인지 검사한다.
String spokenWord = st.nextToken();:
StringTokenizer (st)에서 다음 단어를 가져와 spokenWord 변수에 저장한다. 
st.nextToken()을 호출할 때마다 StringTokenizer는 다음 공백으로 구분된 단어를 반환한다.
if (spokenWord.equals("mumble")) { ... }:
만약 아릴드가 "mumble"이라고 말했다면 이 if 블록이 실행된다.
expectedCount++;: "mumble"은 어떤 숫자든 될 수 있으므로, 현재 expectedCount가 "mumble"이 될 수 있는 숫자라고 가정하고, 다음 차례에 expectedCount + 1을 기대하도록 expectedCount를 1 증가시킨다. 
카운트가 논리적으로 이어졌다고 판단하는 것다.
else { ... }:
아릴드가 "mumble"이 아니라 실제 숫자를 말했다면 이 else 블록이 실행된다.
int currentNumber = Integer.parseInt(spokenWord);: "mumble"이 아닌 단어는 숫자이므로, Integer.parseInt()를 사용해 spokenWord를 정수형으로 변환하여 currentNumber에 저장한다.
if (currentNumber != expectedCount) { ... }:
currentNumber (아릴드가 말한 실제 숫자)와 expectedCount (우리가 논리적으로 기대하는 숫자)를 비교한다.
만약 두 숫자가 다르다면, 아릴드의 카운트가 논리적이지 않다는 의미이므로 이 if 블록이 실행된다.
makesSense = false;: makesSense 플래그를 false로 변경하여 "논리적이지 않음"을 표시한다.
break;: 더 이상 나머지 카운트를 확인할 필요가 없다. 
이미 논리적이지 않다는 결론이 났으므로, for 루프를 즉시 종료한다.
expectedCount++;:
if (currentNumber != expectedCount) 조건이 false인 경우, 즉 아릴드가 말한 숫자가 expectedCount와 일치하는 경우에만 이 부분이 실행된다. 
숫자가 올바르게 이어졌으므로, 다음 차례에 기대할 숫자를 1 증가시킨다.
if (makesSense) { ... } else { ... }:
for 루프가 모두 실행되거나 break 문에 의해 종료된 후, makesSense 플래그의 최종 값을 확인하여 결과를 출력한다.
makesSense가 true이면 "makes sense"를 출력하고, false이면 "something is fishy"를 출력한다.
br.close();:
BufferedReader 사용을 마쳤으니, close() 메서드를 호출하여 열려있는 입력 스트림을 닫고 자원을 해제한다.

코드로 구현

package baekjoon.baekjoon_32;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

// 백준 16316번 문제
public class Main1278 {
    public static void main(String[] args) throws IOException {
        // BufferedReader를 사용하여 입력을 효율적으로 읽어들입니다.
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // 첫 번째 줄에서 n (물린 횟수)을 읽고 정수로 변환합니다.
        int n = Integer.parseInt(br.readLine());

        // 두 번째 줄에서 n개의 단어를 읽어옵니다.
        // StringTokenizer를 사용하여 공백 기준으로 단어를 분리합니다.
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");

        // 아릴드가 기대하는 다음 카운트 숫자를 저장할 변수입니다. 1부터 시작합니다.
        int expectedCount = 1;
        // 카운트가 논리적인지 여부를 추적하는 플래그입니다. 기본값은 '논리적이다' 입니다.
        boolean makesSense = true;

        // n번의 물린 횟수만큼 반복합니다.
        for (int i = 0; i < n; i++) {
            // StringTokenizer에서 다음 단어를 가져옵니다.
            String spokenWord = st.nextToken();

            // 만약 아릴드가 "mumble"이라고 말했다면,
            if (spokenWord.equals("mumble")) {
                // "mumble"은 어떤 숫자든 될 수 있으므로, 현재 expectedCount가 맞다고 가정하고
                // 다음 카운트로 넘어갑니다.
                expectedCount++;
            } else {
                // "mumble"이 아니라 숫자를 말했다면, 해당 단어를 정수로 변환합니다.
                int currentNumber = Integer.parseInt(spokenWord);

                // 현재 말한 숫자가 우리가 기대하는 숫자와 다르다면,
                if (currentNumber != expectedCount) {
                    // 논리적인 흐름이 끊겼으므로 makesSense 플래그를 false로 설정하고 반복을 중단합니다.
                    makesSense = false;
                    break;
                }
                // 숫자가 일치한다면, 다음 카운트로 넘어갑니다.
                expectedCount++;
            }
        }

        // 반복문이 끝난 후 makesSense 플래그의 값에 따라 결과를 출력합니다.
        if (makesSense) {
            System.out.println("makes sense");
        } else {
            System.out.println("something is fishy");
        }

        // BufferedReader를 닫아 자원을 해제합니다.
        br.close();
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글