백준 빙고

KIMYEONGJUN·2025년 3월 4일
post-thumbnail

문제

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

첫째 줄부터 다섯째 줄까지 빙고판에 쓰여진 수가 가장 위 가로줄부터 차례대로 한 줄에 다섯 개씩 빈 칸을 사이에 두고 주어진다.
여섯째 줄부터 열째 줄까지 사회자가 부르는 수가 차례대로 한 줄에 다섯 개씩 빈 칸을 사이에 두고 주어진다.
빙고판에 쓰여진 수와 사회자가 부르는 수는 각각 1부터 25까지의 수가 한 번씩 사용된다.

첫째 줄에 사회자가 몇 번째 수를 부른 후 철수가 "빙고"를 외치게 되는지 출력한다.

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

입력 처리:
BufferedReader와 BufferedWriter를 사용하여 입력과 출력을 처리해준다.
Block 클래스를 정의하여 각 숫자의 (행, 열) 위치를 저장합니다. x는 열, y는 행을 나타낸다.
빙고판 입력:
첫 번째 루프에서 5x5 빙고판의 숫자를 입력받는다.
각 숫자는 1부터 25까지의 자연수이며, 해당 숫자의 위치를 bing 배열에 Block 객체로 저장한다.
사회자가 부르는 숫자 입력:
두 번째 루프에서 사회자가 부르는 숫자를 입력받는다.
각 숫자가 불릴 때마다 해당 숫자의 위치를 찾아 현재 행과 열을 확인한다.
빙고 체크:
부른 숫자의 행과 열에 대해 각각의 카운트를 증가시킨다.
또한, 두 대각선에 대해서도 체크한다.
왼쪽 위에서 오른쪽 아래 대각선을 체크한다.
오른쪽 위에서 왼쪽 아래 대각선을 체크한다.
각 방향에서의 카운트가 5에 도달하면 빙고가 발생한 것으로 간주한다.
결과 출력:
만약 빙고가 3개 이상 발생한 경우, 해당 차례(cnt)를 ans에 저장합니다. 모든 숫자가 불린 후, 결과를 출력한다.

코드로 구현

package baekjoon.baekjoon_27;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

// 백준 2578번 문제
public class Main950 {
    static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

    // 좌표를 저장하기 위한 Block 클래스
    static class Block {
        int x, y; // x는 열, y는 행
        Block(int y, int x) {
            this.y = y;
            this.x = x;
        }
    }

    public static void main(String args[]) throws Exception {
        Block[] bing = new Block[25]; // 1부터 25까지의 숫자에 대한 위치 저장
        int[][] bingGo = new int[2][5]; // 빙고 체크를 위한 배열 (0: 열, 1: 행)
        int[] diagonal = new int[2]; // 대각선 체크를 위한 배열 (0: 왼쪽 위에서 오른쪽 아래, 1: 오른쪽 위에서 왼쪽 아래)
        int n, ans = 0, cnt = 0, bingCnt = 0; // n: 현재 숫자, ans: 빙고가 발생한 차례, cnt: 호출된 숫자 수, bingCnt: 빙고 수

        // 빙고판 입력 및 숫자 위치 저장
        for(int i = 0; i < 5; i++) {
            String[] in = br.readLine().split(" ");
            for(int j = 0; j < 5; j++) {
                n = Integer.parseInt(in[j]);
                bing[n - 1] = new Block(i, j); // 숫자 n의 위치를 Block 객체로 저장
            }
        }

        // 사회자가 부르는 숫자 입력
        for(int i = 0; i < 5; i++) {
            String[] in = br.readLine().split(" ");
            for(int j = 0; j < 5; j++) {
                if(ans != 0) // 이미 빙고가 발생한 경우
                    continue; // 다음 숫자로 넘어감
                cnt++; // 호출된 숫자 수 증가
                n = Integer.parseInt(in[j]); // 현재 부른 숫자
                int nowY = bing[n - 1].y; // 현재 숫자의 행
                int nowX = bing[n - 1].x; // 현재 숫자의 열

                // 해당 열의 빙고 체크
                if(++bingGo[0][nowX] >= 5)
                    bingCnt++;

                // 해당 행의 빙고 체크
                if(++bingGo[1][nowY] >= 5)
                    bingCnt++;

                // 왼쪽 위에서 오른쪽 아래 대각선 체크
                if(nowX == nowY)
                    if(++diagonal[0] >= 5)
                        bingCnt++;

                // 오른쪽 위에서 왼쪽 아래 대각선 체크
                if(nowX + nowY == 4)
                    if(++diagonal[1] >= 5)
                        bingCnt++;

                // 빙고가 3개 이상 발생했는지 체크
                if(bingCnt >= 3)
                    ans = cnt; // 몇 번째 숫자에서 빙고가 발생했는지 저장
            }
        }

        // 결과 출력
        bw.write(ans + "\n");
        bw.flush();
        bw.close();
        br.close();
    }
}

마무리

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

profile
Junior backend developer

0개의 댓글