[백준] 2578번: 빙고 (Java)

seri·2024년 7월 1일
0

코딩테스트 챌린지

목록 보기
8/62

문제: https://www.acmicpc.net/problem/2578

📌 문제 탐색하기

입력 : 첫째 줄부터 다섯째 줄 - 빙고판에 쓰여진 수 x (1 ≤ x ≤ 25)
여섯째 줄부터 열째 줄 - 사회자가 부르는 수 y (1 ≤ y ≤ 25)
출력 : 사회자가 몇번째 수를 부른 후 빙고를 외치게 되는지

가능한 시간복잡도

O(1)

알고리즘 선택

구현

📌 코드 설계하기

  1. 첫째 줄부터 다섯째 줄까지 빙고판에 쓰여진 수를 2차원 배열 Input으로 받는다.
  2. 여섯 줄부터 열째 줄까지 사회자가 부르는 수를 1차원 배열 Input으로 받는다.
  3. 빙고가 되는 라인의 수를 체크해 3개 이상 빙고가 되는 순간의 수를 출력한다.

📌 시도 회차 수정 사항 (Optional)

💡 시도별 수정 사항은 어떻게 작성하나요?
- 무문별하게 “맞았습니다”가 나올때 까지 수정하는 형태의 문제 풀이를 반복하면 , 내가 어떤 실수를 해서 해당 문제를 틀렸는지 모르게 됩니다.
- 틀렸습니다를 받았다면 왜 틀렸는지 고민해보고 , 어떻게 수정할 수 있는지 고민하는 과정을 작성해주시면 됩니다.
- 위에 내가 세울 설계에서 어떤 부분이 틀렸는지도 함께 점검해보세요
- 한번에 맞출수도 있기 때문에 이 칸은 Optional입니다.

1회차

2회차

📌 정답 코드

import java.util.*;

public class Main {
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        int[][] x = new int[5][5];
        int[] y = new int[25];
        
        // 빙고 보드 입력 받기
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                x[i][j] = sc.nextInt();
            }
        }
        
        // 부른 숫자 입력 받기
        for (int i = 0; i < 25; i++) {
            y[i] = sc.nextInt();
        }
        
        int bingoCount = 0;
        int result = 0;
        
        // 부른 숫자를 하나씩 처리
        for (int i = 0; i < 25; i++) {
            int number = y[i];
            markNumber(x, number);
            
            bingoCount = checkBingo(x);
            
            if (bingoCount >= 3) {
                result = i + 1;  // 몇 번째 숫자에서 빙고가 되는지
                break;
            }
        }
        
        sc.close();
        System.out.print(result);
    }
    
    // 부른 숫자를 빙고 보드에서 0으로 마크
    public static void markNumber(int[][] board, int number) {
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                if (board[i][j] == number) {
                    board[i][j] = 0;
                }
            }
        }
    }

    // 빙고 라인을 세는 함수
    public static int checkBingo(int[][] board) {
        int count = 0;

        // 가로 체크
        for (int i = 0; i < 5; i++) {
            boolean bingo = true;
            for (int j = 0; j < 5; j++) {
                if (board[i][j] != 0) {
                    bingo = false;
                    break;
                }
            }
            if (bingo) count++;
        }

        // 세로 체크
        for (int i = 0; i < 5; i++) {
            boolean bingo = true;
            for (int j = 0; j < 5; j++) {
                if (board[j][i] != 0) {
                    bingo = false;
                    break;
                }
            }
            if (bingo) count++;
        }

        // 대각선 체크 (좌상단 -> 우하단)
        boolean diagonalBingo = true;
        for (int i = 0; i < 5; i++) {
            if (board[i][i] != 0) {
                diagonalBingo = false;
                break;
            }
        }
        if (diagonalBingo) count++;

        // 대각선 체크 (우상단 -> 좌하단)
        diagonalBingo = true;
        for (int i = 0; i < 5; i++) {
            if (board[i][4 - i] != 0) {
                diagonalBingo = false;
                break;
            }
        }
        if (diagonalBingo) count++;

        return count;
    }
}
profile
꾸준히 정진하며 나아가기

0개의 댓글