백준 2578 (Java) 빙고
728x90
SMALL

꼼꼼하게 구현이 필요한 문제이다.

 

현재 입력된 cur를 visit에 체크하여 visit 2차원배열의 값을 1로 바꾼다

 

그리고 각각 우상대각, 좌상대각, row, column의 개수를 세는 변수를 생성한다.

2중 반복문을 돌려 visit의 합이 5라면, 한줄의 빙고가 완성된 것이다.

 

우상대각, 좌상대각, row, column의 개수가 3이 되었다면 현재 위치를 출력하고 종료한다.

 

 

코드의 아래 주석은 질문 게시판에 있던 반례이다.

이 반례로 내가 현재 출력값을 다른걸로 착각하고 있었음을 깨달았다.

 

package com.boj.s2578;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;


public class Main {
    static int[][] arr = new int[5][5];
    static int[][] visit = new int[5][5];
    static void checkVisit(int cur) {
    // 현재 입력된 cur를 visit 체크
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                if (arr[i][j] == cur) {
                    visit[i][j] = 1;
                    return;
                }
            }
        }
    }
	
    static int sol(int cur) {
        checkVisit(cur);
        int[] row = new int[5];
        int[] col = new int[5];
        int rows =0;
        int cols=0;
        int dia1=0; // 좌상대각을 이루는 개수 저장
        int dia2 = 0; // 우상대각을 이루는 개수 저장

        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                row[i] += visit[i][j]; 
                col[i] += visit[j][i];
            }
        }
        for (int i = 0; i < 5; i++) {
            if (row[i] == 5) { 
            // row[i]가 5라면, i번째 row에 5개의 값이 방문되었다는 뜻으로,
            // 한줄의 빙고가 이뤄졌음을 뜻한다.
                rows++;
            }
            if (col[i] == 5) {
                cols++;
            }
        }
        for (int i = 0; i < 5; i++) {
            dia1 += visit[i][i];
            dia2 += visit[4 - i][i];
        }
        dia1 = dia1 == 5 ? 1 : 0;
        dia2 = dia2 == 5 ? 1 : 0;
		// 3줄이 이뤄졌다면?
        if (rows + cols + dia2 + dia1 >= 3) {
            return cur;
        }

        return 0;
    }
    public static void main(String[] args) 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++) {
                arr[i][j] = Integer.parseInt(st.nextToken());
            }
        }
        for (int i = 0; i < 5; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            for (int j = 0; j < 5; j++) {
                int a = Integer.parseInt(st.nextToken());
                int ans = sol(a);
                if (ans != 0) {
                    System.out.println((i)*5 + (j+1));
                    return;
                }
            }
        }
    }
}
/*

1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
6 7 8 9 10
3 13 18 23 5
17 21 1 2 4
11 12 14 15 16
19 20 22 24 25

* */
728x90
LIST