본문 바로가기

백준

백준 2578 빙고 (JAVA)

문제

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

 

2578번: 빙고

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

www.acmicpc.net

코드

package com.company;

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

class Main {

    static int[][] board = new int[5][5];
    static int count;
    static boolean useUp = false;
    static boolean useDown = false;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        int k = 0, l = 0;
        int a = 0, b = 0;
        for (int i = 0; i < 5; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < 5; j++) {
                board[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        for (int i = 0; i < 5; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < 5; j++) {
                int num = Integer.parseInt(st.nextToken());

                for (k = 0; k < 5; k++) {
                    for (l = 0; l < 5; l++) {
                        if (board[k][l] == num) {
                            board[k][l] = 0;
                            a = k;
                            b = l;
                        }
                    }
                }

                int t = 0;
                rCheck(a, b);
                lCheck(a, b);
                upCheck();
                downCheck();

                if (count >= 3) {
                    System.out.println(i * 5 + j + 1);
                    return;
                }
            }
        }
    }

    private static void rCheck(int i, int j) {
        int zeroCount = 0;
        for (int k = 0; k < 5; k++) {
            if (board[i][k] == 0)
                zeroCount++;
        }
        if (zeroCount == 5)
            count++;
    }

    private static void lCheck(int i, int j) {
        int zeroCount = 0;
        for (int k = 0; k < 5; k++) {
            if (board[k][j] == 0)
                zeroCount++;
        }
        if (zeroCount == 5)
            count++;
    }

    private static void upCheck() {
        int zeroCount = 0;
        if (!useUp) {
            for (int i = 0; i < 5; i++) {
                if (board[4 - i][i] == 0)
                    zeroCount++;
            }
            if (zeroCount == 5) {
                count++;
                useUp = true;
            }
        }
    }

    private static void downCheck() {
        int zeroCount = 0;
        if (!useDown) {
            for (int i = 0; i < 5; i++) {
                if (board[i][i] == 0)
                    zeroCount++;
            }
            if (zeroCount == 5)
                count++;
            useDown = true;
        }
    }
}

풀이

풀이 방법에 대해서 쉽게 생각을 할수있었지만 구현하는데에 있어서 수고스러운 문제였다. 풀이의 개요는 다음과 같다. 먼저 빙고값을 받고 저장을 해준다. 그리고 사회자가 불러주는 값에 대해서는 하나씩 받으면서 바로바로 처리해준다. 이때 처리하는 메서드는 총 4개이다. 가로줄에 대해서 검사하는 메서드와 세로줄에 대해서 검사하는 메서드, 대각선을 검사하는 메서드 2개로 이루어진다. 이를 한번에 구현할려면 복잡해지니 하나씩 구분해서 구현하는것이 바람직 하다. 메서드의 구현 방법은 코드를 보면 쉽게 이해가 될 것이다.

'백준' 카테고리의 다른 글

백준 1913 달팽이 (JAVA)  (0) 2022.07.11
백준 4396 지뢰 찾기 (JAVA)  (0) 2022.07.08
백준 20546 🐜기적의 매매법🐜 (JAVA)  (0) 2022.07.05
백준 21918 전구 (JAVA)  (0) 2022.07.05
백준 5597 과제 안 내신 분..? (JAVA)  (0) 2022.07.05