Algorithm/BOJ

BOJ_2578_빙고

wow 2021. 3. 5. 21:38

문제 분석

- 그대로 구현하면 되는데, 세부 조건들까지 잘 고려해서 풀이해야하니까 조금 까다로웠다.

1) 시간을 줄이기 위해 행,열,양쪽 대각선에 빙고가 되는지 확인하는 메소드를 빙고 3줄이 만들어지기 위한 최소 갯수 12개부터 실행하도록 한다. (문제 맨 아래 그림 참고)

2) 빙고는 3줄이되면 벗어나지만 하나를 칠했을 때 두 줄이 빙고가 되는 경우도 있기 때문에 ==이 아닌 >= 조건을 사용한다.

 

 

문제 풀이

1) 빙고판을 설정한다.

2) 사회자가 불러주는 번호를 빙고판에서 0처리한다.

3) 빙고가 3줄 이상이 되는지 행,열,양쪽 대각선을 확인한다.

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {

	private static int[][] map;
	private static int bingo, idx;

	public static void main(String[] args) throws Exception {

		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());
			}
		}

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

				if (idx >= 12) // 12번째 숫자부터 최소한의 숫자로 3줄의 빙고를 만들 수 있으니까 
					bingo();
				if (bingo >= 3) {
					System.out.println(idx);
					System.exit(0);
				}
			}
		}

	}// main

	private static void chk(int num) {
		for (int i = 0; i < 5; i++) {
			for (int j = 0; j < 5; j++) {
				if (map[i][j] == num) {
					map[i][j] = 0;
					return;
				}
			}
		}
	}// chk

	private static void bingo() {
		bingo =0;
		boolean r = true;
		// 행에 빙고가 있는지 확인
		for (int i = 0; i < 5; i++) {
			r = true;
			for (int j = 0; j < 5; j++) {
				if (map[i][j] != 0) {
					r = false;
				}
			}
			if (r) {
				bingo++;
				if (bingo >= 3)
					return;
			}
		}

		boolean c = true;
		// 열에 빙고가 있는지 확인
		for (int i = 0; i < 5; i++) {
			c = true;
			for (int j = 0; j < 5; j++) {
				if (map[j][i] != 0) {
					c = false;
				}
			}
			if (c) {
				bingo++;
				if (bingo >= 3)
					return;
			}
		}

		boolean down = true;
		// 대각선아래방향에 빙고가 있는지 확인
		for (int i = 0; i < 5; i++) {
			if (map[i][i] != 0) {
				down = false;
			}
		}
		if (down) {
			bingo++;
			if (bingo >= 3)
				return;
		}

		boolean up = true;
		// 대각선 위 방향에 빙고가 있는지 확인
		for (int i = 0; i < 5; i++) {
			if (map[i][4 - i] != 0) {
				up = false;
			}
		}
		if (up) {
			bingo++;
			if (bingo >= 3)
				return;
		}

	}// bingo

}// class-end