본문 바로가기

알고리즘 문제풀이/백준

[백준][JAVA] 2578 - 빙고

문제 출처: https://www.acmicpc.net/problem/2578

 

2578번: 빙고

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

www.acmicpc.net

 

 

 

 

문제

 

 

 

설명

단순 구현 문제입니다. 

사회자가 부른 숫자를 자신의 빙고판에 표시하다가, 최소 12개 이상부터 빙고가 가능하기 때문에 12개 이후에는 사회자가 부른 수를 빙고판에 표시할 때마다 빙고 상태인지를 체크하게 했습니다.

여기서 중요한 점은, 빙고 체크가 한번 끝날 때마다 다시 cnt 변수를 0으로 초기화 해주어야 한다는 점입니다!

 

 

 

코드

import java.util.Scanner;

public class BOJ2578_Bingo {
	
	static int[][] bingo;
	static int[][] chk; //빙고판 숫자 체크 배열
	
	public static void main(String[] args) throws Exception {
		Scanner sc = new Scanner(System.in);
		bingo = new int[5][5];
		chk = new int[5][5];
		int[] mc = new int[25];
		int cnt=0, answer=0; //cnt: 선 수  answer: 사회자가 부른 숫자의 갯수
		
		for(int i=0; i<5; i++) {
			for(int j=0; j<5; j++) {
				bingo[i][j]=sc.nextInt();
			}
		}
		for(int i=0; i<25; i++) //사회자가 부르는 숫자 
			mc[i] = sc.nextInt();
		//입력 완료
		
		for(int i=0; i<25; i++) {
			
			for(int j=0; j<5; j++) {
				for(int k=0; k<5; k++) {
					if(bingo[j][k]==mc[i]) { //부른 수를 체크표시.
						chk[j][k]=1;
						answer++;
					}
				}
			}
			
			if(i>=11) {//최소 12개 이상부터 빙고 가능하므로, 12개 이후에는 사회자가 수를 부를 때마다 빙고 체크
				int tmp3=0, tmp4=0;
				for(int a=0; a<5; a++) {
					int tmp1=0, tmp2=0; //초기화 필요
					for(int b=0; b<5; b++) {
						tmp1 += chk[a][b];
						tmp2 += chk[b][a];
						if(b==4 && tmp1==5) { //가로 한 줄이 빙고일 경우
							cnt++;
						}
						if(b==4 && tmp2==5) {//세로 한 줄이 빙고인 경우
							cnt++;
						}
						if(a==b) { //대각선 1
							tmp3+=chk[a][b];
						}
						if(a+b==4) {//대각선 2
							tmp4+=chk[a][b];
						}
					}
				}
				if(tmp3==5) cnt++; //대각선 1이 빙고인 경우
				if(tmp4==5) cnt++; //대각선 2가 빙고인 경우
				
				if(cnt>=3)
					break;
			}
			cnt=0; //빙고 체크 한번 끝날 때마다 초기화 해줘야 함.
		}
		System.out.println(answer);
	}
}