Algorithm/baekjoon

빙고

마닐라 2022. 3. 3. 16:20

📍 문제 설명

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

 

2578번: 빙고

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

www.acmicpc.net

 

💡 접근

사회자가 부르는 수를 빙고판에 기록해두고 최소로 빙고를 외칠 수 있는 숫자부터 빙고판 확인하면 되는 문제였다.

 

👩‍💻 코드

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

public class Main {
    static int n, m, v, e, k, r, t, answer, sum, max = Integer.MIN_VALUE, min = Integer.MAX_VALUE, firstX, firstY;
    static int[] arr, dx = {1,0,-1,0}, dy = {0,-1,0,1};
    static long[] dp;
    static int[][] board, bingo, nearEmptySeatCnt;
    static boolean[][] visited;
    static ArrayList<Integer> list;
    static HashMap<Integer, Integer> map;
    static HashSet<Integer> set;
    static StringBuilder sb;
    static StringTokenizer st;

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

        //빙고판
        ArrayList<Point> list = new ArrayList<>();
        //사회자가 부르는 수
        arr = new int[25];
        //빙고판에 맞춘 거
        visited = new boolean[5][5];

        for(int i = 0; i < 5; i++) {
            st = new StringTokenizer(br.readLine());
            for(int j = 0; j < 5; j++) {
                list.add(new Point(i, j, Integer.parseInt(st.nextToken())));
            }
        }

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


        int cnt = 0;
        //최소 13번은 불러야 빙고 완성이 가능하다.
        for(int i = 0; i < arr.length; i++) {
            for(int j = 0; j < list.size(); j++) {
                if(list.get(j).num == arr[i]) {
                    visited[list.get(j).x][list.get(j).y] = true;
                    cnt++;
                }
            }
            //빙고 외칠 수 있는지 확인
            if(cnt >= 12) shoutBingo(cnt);
        }
    }

    private static void shoutBingo(int cnt) {
        int bingoCnt = 0;

        for(int i = 0; i < 5; i++) {
            //가로 확인
            for(int j = 0; j < 5; j++) {
                if(!visited[i][j]) break;
                if(j == 4) {
                    bingoCnt++;
                }
            }
            //세로확인
            for(int j = 0; j < 5; j++) {
                if(!visited[j][i]) break;
                if(j == 4) {
                    bingoCnt++;
                }
            }
        }

        //대각선 확인
        // 0,0 1,1 2,2 3,3 4,4
        for(int i = 0; i < 5; i++) {
            if(!visited[i][i]) break;
            if(i == 4) {
                bingoCnt++;
            }
        }
        // 0,4 1,3 2,2 3,1 4,0
        for(int i = 0; i < 5; i++) {
            if(!visited[i][4-i]) break;
            if(i == 4) {
                bingoCnt++;
            }
        }

        if(bingoCnt >= 3) {
            System.out.println(cnt);
            System.exit(0);
        }

    }

    private void solution() {
    }


    private static class Point {
        private int x;
        private int y;
        private int num;

        public Point(int x, int y, int num) {
            this.x = x;
            this.y = y;
            this.num = num;
        }

        @Override
        public String toString() {
            return "Point{" +
                    "x=" + x +
                    ", y=" + y +
                    ", num=" + num +
                    '}';
        }
    }
}

'Algorithm > baekjoon' 카테고리의 다른 글

오리  (0) 2022.05.04
뱀과 사다리 게임  (0) 2022.03.15
소가 길을 건너간 이유 1  (0) 2022.03.03
기적의 매매법  (0) 2022.03.03
상어 초등학교  (0) 2022.03.02