[붙끝코] 8일차 (백준 2578)

Burpeeeee·2024년 9월 16일
post-thumbnail

가능할지는 모르겠지만 오늘부터 파이썬과 자바 두가지 언어로 풀어보도록 하겠다!

파이썬 업데이트 예정
자바는 최대한 객체 지향적으로(?) 작성예정

문제
백준 2578

📌 문제 탐색하기

input

  • 첫째줄: 5x5 빙고 (1부터 25까지의 자연수 하나씩 )
  • 두번째줄: 사회자가 부르는 수 (1부터 25까지의 자연수 하나씩)

output

차례로 수를 지워가다가 같은 가로줄, 세로줄 또는 대각선 위에 있는 5개의 모든 수가 지워지는 경우 그 줄에 선을 긋는다.
그어진 선이 3개면 빙고! 이다. -> 몇번째 수를 부른 후

📌 코드 설계하기

문제 유형: 시뮬레이션

- int[][] board: 빙고판을 저장
- boolean[][] checkBoard: 숫자 불렸는지 불리지 않았는지 여부 체크
- Map<Integer, int[]> numPositions: 각 숫자의 위치를 저장
- List <Integer> calls: 사회자가 부르는 숫자를 저장
  • 입력: 빙고판 입력, 사회자 부르는 수 입력 ->BufferedReader와 StringTokenizer를 사용
  • 빙고판 입력 시 동시에 map에 각 숫자의 위치를 저장.
  1. 메서드
  • solveBingo :
    사회자가 부르는 숫자를 순서대로 처리.
    각 숫자에 대해 위치를 찾아 체크하고 빙고 여부를 확인.
  • checkBingo :
    가로, 세로, 대각선 방향으로 빙고를 확인.
    빙고 개수가 3이상이면true를 반환.
  • checkLine:

    주어진 방향으로 5개의 칸이 모두 체크되었는지 확인.

📌 시도 회차 수정 사항

-BFS나 DFS 로 해결해야 했나 고민. -> 호명되는 숫자의 순서 이미 확정이기 때문에 그냥 반복문을 이용해서 빙고 게임하듯 구현하는게 나을 듯.

📌 정답 코드

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

public class Main {
    int[][] board = new int[5][5];
    boolean[][] checkBoard = new boolean[5][5];
    Map<Integer, int[]> numPositions = new HashMap<>();
    List<Integer> calls = new ArrayList<>();

    public static void main(String[] args) throws IOException {
        new Main().solution();
    }

    void solution() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // 빙고판 입력 
        for (int i = 0; i < 5; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            for (int j = 0; j < 5; j++) {
                int num = Integer.parseInt(st.nextToken());
                board[i][j] = num;
                numPositions.put(num, new int[]{i, j});
            }
        }

        // 사회자가 부르는 숫자 입력 
        for (int i = 0; i < 5; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            for (int j = 0; j < 5; j++) {
                calls.add(Integer.parseInt(st.nextToken()));
            }
        }

        System.out.println(solveBingo());
    }

    int solveBingo() {
        for (int i = 0; i < calls.size(); i++) {
            int num = calls.get(i);
            int[] pos = numPositions.get(num);
            checkBoard[pos[0]][pos[1]] = true;

            if (checkBingo()) {
                return i + 1;
            }
        }
        return 25;
    }

    boolean checkBingo() {
        int bingoCount = 0;

        // 가로, 세로 라인 확인
        for (int i = 0; i < 5; i++) {
            if (checkLine(i, 0, 0, 1)) bingoCount++;
            if (checkLine(0, i, 1, 0)) bingoCount++;
        }

        // 대각선 확인
        if (checkLine(0, 0, 1, 1)) bingoCount++;
        if (checkLine(0, 4, 1, -1)) bingoCount++;

        return bingoCount >= 3;
    }

    boolean checkLine(int startX, int startY, int dx, int dy) {
        for (int i = 0; i < 5; i++) {
            if (!checkBoard[startX + i * dx][startY + i * dy]) {
                return false;
            }
        }
        return true;
    }
}
profile
? 이 가득하지만 곧 !이 될

0개의 댓글