코딩테스트/백준

[백준]2578번 빙고 - Java

GAEBAL 2022. 3. 5. 13:24
728x90

문제

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

 

2578번: 빙고

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

www.acmicpc.net

 

풀이

for문 안에서 인덱싱에 주의하면서 각 행마다, 각 열마다, 대각선 2개까지 빙고를 체크해주면 됨

 

주의할 점은 사회자가 부르는 수로 인해서 한번에 빙고가 2개가 생기는 경우가 있을 수도 있기 때문에 마지막에

bingoCount == 3 이 아닌 bingoCount >= 3 으로 해줘야함!

 

코드

// 2578번 빙고
// https://www.acmicpc.net/problem/2578

package BAEKJOON;

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

public class Num2578_빙고 {
    static int[][] map;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        map = new int[5][5];
        for (int i = 0; i < 5; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < 5; j++) {
                map[i][j] = Integer.parseInt(st.nextToken());
            }
        }
        int[] arr = new int[26];
        st = new StringTokenizer(br.readLine());
        for (int i = 1; i <= 25; i++) {
            if (!st.hasMoreTokens()) {
                st = new StringTokenizer(br.readLine());
            }
            arr[i] = Integer.parseInt(st.nextToken());
        }

        for (int b = 1; b <= 25; b++) {
            for (int i = 0; i < 5; i++) {
                for (int j = 0; j < 5; j++) {
                    if (map[i][j] == arr[b]) {
                        map[i][j] = 0;
                    }
                }
            }
            if (check(map)) {
                System.out.println(b);
                break;
            }
        }
    }


    public static boolean check(int[][] map) {
        int bingoCount = 0;
        
        // 각 행
        for (int i = 0; i < map.length; i++) {
            int count = 0;
            for (int j = 0; j < map[i].length; j++) {
                if (map[i][j] == 0) {
                    count++;
                }
            }
            if (count == 5) {
                bingoCount++;
            }
        }
        
        // 각 열
        for (int i = 0; i < map.length; i++) {
            int count = 0;
            for (int j = 0; j < map[i].length; j++) {
                if (map[j][i] == 0) {
                    count++;
                }
            }
            if (count == 5) {
                bingoCount++;
            }
        }
        
        // 왼쪽 위에서 오른쪽 아래 대각선
        int count = 0;
        for (int i = 0; i < map.length; i++) {
            count = 0;
            if (map[i][i] == 0) {
                count++;
            }
            if (count == 5) {
                bingoCount++;
            }
        }

        // 오른쪽 위에서 왼쪽 아래 대각선
        count = 0;
        for (int i = 0; i < map.length; i++) {

            if (map[map.length - 1 - i][i] == 0) {
                count++;
            }
            if (count == 5) {
                bingoCount++;
            }
        }

        // 하나로 빙고가 2개가 더 생기는 경우가 있기 때문에
        // bingoCount == 3 이 아닌 >= 3 으로 해줘야함
        if (bingoCount >= 3) {
            return true;
        } else {
            return false;
        }
    }
}
728x90