[BOJ] 2578번 빙고 - JAVA

최영환·2024년 8월 19일
0
post-thumbnail

💡 문제

💬 입출력 예시

📌 풀이(소스코드)

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

public class Main {

    static final int SIZE = 5;
    static int result = 0;
    static int lineCnt = 0;
    static int[][] board = new int[SIZE][SIZE];

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

        for (int i = 0; i < SIZE; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            for (int j = 0; j < SIZE; j++) {
                board[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        for (int i = 0; i < SIZE; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            for (int j = 0; j < SIZE; j++) {
                result++;
                // 사회자가 부르는 숫자
                int num = Integer.parseInt(st.nextToken());

                // 숫자 사용처리
                for (int r = 0; r < SIZE; r++) {
                    for (int c = 0; c < SIZE; c++) {
                        if (board[r][c] == num) {
                            board[r][c] = -1;
                        }
                    }
                }
                // 빙고 확인
                checkRow();
                checkCol();
                checkLeftDiagonal();
                checkRightDiagonal();

                if (lineCnt >= 3) {
                    System.out.println(result);
                    return;
                }
                lineCnt = 0;    //  중복을 막기 위해 초기화
            }
        }
    }

    private static void checkRow() {
        for (int i = 0; i < SIZE; i++) {
            int count = 0;
            for (int j = 0; j < SIZE; j++) {
                if (board[i][j] == -1) {
                    count++;
                }
            }
            if (count == SIZE) {
                lineCnt++;
            }
        }
    }

    private static void checkCol() {
        for (int i = 0; i < SIZE; i++) {
            int count = 0;
            for (int j = 0; j < SIZE; j++) {
                if (board[j][i] == -1) {
                    count++;
                }
            }
            if (count == SIZE) {
                lineCnt++;
            }
        }
    }

    private static void checkLeftDiagonal() {
        int count = 0;
        for (int i = 0; i < SIZE; i++) {
            if (board[i][i] == -1) {
                count++;
            }
            if (count == SIZE) {
                lineCnt++;
            }
        }
    }

    private static void checkRightDiagonal() {
        int count = 0;
        for (int i = 0; i < SIZE; i++) {
            if (board[i][SIZE - i - 1] == -1) {
                count++;
            }
            if (count == SIZE) {
                lineCnt++;
            }
        }
    }
}

📄 해설

접근

  • 문제에서 주어진 조건에 따라, 가로, 세로, 대각선 5 칸을 확인해서 3줄 빙고가 되는지를 확인하면 되는 문제
  • 문제 접근이나 풀이 과정 자체는 어렵지 않으나, 구현하는 과정이 조금 까다로울 수 있다. 작성자 얘기 맞다 😅

과정

  • 빙고판을 입력 받고, 저장한 뒤, 사회자가 불러주는 숫자들을 하나씩 지운다. 지워진 숫자는 -1 로 표시한다.
  • 숫자 한개를 지울 때 마다 빙고가 완성 됐는지를 확인한다. 이때, 가로, 세로, 대각선 모두를 확인해준다.
  • 확인하면서 총 빙고의 숫자인 lineCnt 변수의 값을 증가시키고, 이 값이 3을 넘으면 빙고를 외칠 타이밍이므로, 몇번째 숫자인지를 기억하고 있는 result 변수를 출력하고 프로그램을 종료한다.
profile
조금 느릴게요~

0개의 댓글