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

[백준/Java] 7484번 Bowling

by 현장 2026. 4. 3.

-Code

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

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

        int gameCnt = Integer.parseInt(br.readLine());

        for (int game = 0; game < gameCnt; game++) {
            // 볼링 넘어뜨린 핀 갯수 저장
            StringTokenizer st = new StringTokenizer(br.readLine());
            List<Integer> downPinCnts = new ArrayList<>();
            while (st.hasMoreTokens()) {
                downPinCnts.add(Integer.parseInt(st.nextToken()));
            }
            // 점수 계산
            int idx = 0;
            int score = 0;
            for (int frame = 1; frame <= 10; frame++) {
                int downPinCnt = downPinCnts.get(idx);
                // 스트라이크인 경우
                if (downPinCnt == 10) {
                    score += 10 + downPinCnts.get(idx + 1) + downPinCnts.get(idx + 2);
                    idx++;
                } else {
                    // 스트라이크가 아닌 경우
                    int sumDownCnt = downPinCnt + downPinCnts.get(idx + 1);
                    // 스페어 아닌 경우 처리
                    if (sumDownCnt < 10) {
                        score += sumDownCnt;
                    } else {
                        // 스페어 처리
                        score += sumDownCnt + downPinCnts.get(idx + 2);
                    }
                    // 2개의 핀 갯수 사용으로 +2
                    idx += 2;
                }
            }
            System.out.println(score);
        }
    }
}

문제를 푸는데 조건 설계는 거의 맞았으나 2가지 문제가 있었습니다.

  1. frame 기준으로 해야하는데 downPinCnts의 크기를 기준으로 한 것
  2. 넘어뜨린 핀을 10이 되면 다음걸 확인 해야하는데 잘못된 이해로 스트라이크와 스페어를 3개의 넘어뜨린 핀의 갯수를 묶고 오픈은 2개의 핀의 갯수를 묶어서 처리하려고 한것

위와 같이 2개의 문제가 있어서 출력은 되나 이상한 값이 나왔습니다. 그래서 찾아보니 2개의 문제점을 알게 되었고 각각 frame을 기준으로 for문을 돌리면서 idx의 이동을 스트라이크는 +1, 스페어와 오픈은 2개의 핀 갯수를 사용하므로 +2로 처리해 해결했습니다.