본문 바로가기

문제 풀이/Baekjoon

[백준] S5 2578번 빙고 (JAVA)

문제 출처 - SW Expert Academy

문제는 여기

 

2578번: 빙고

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

www.acmicpc.net

[문제] 

빙고 게임은 다음과 같은 방식으로 이루어진다.

먼저 아래와 같이 25개의 칸으로 이루어진 빙고판에 1부터 25까지 자연수를 한 칸에 하나씩 쓴다

다음은 사회자가 부르는 수를 차례로 지워나간다. 예를 들어 5, 10, 7이 불렸다면 이 세 수를 지운 뒤 빙고판의 모습은 다음과 같다.


 

차례로 수를 지워가다가 같은 가로줄, 세로줄 또는 대각선 위에 있는 5개의 모든 수가 지워지는 경우 그 줄에 선을 긋는다.

이러한 선이 세 개 이상 그어지는 순간 "빙고"라고 외치는데, 가장 먼저 외치는 사람이 게임의 승자가 된다.

철수는 친구들과 빙고 게임을 하고 있다. 철수가 빙고판에 쓴 수들과 사회자가 부르는 수의 순서가 주어질 때, 사회자가 몇 번째 수를 부른 후 철수가 "빙고"를 외치게 되는지를 출력하는 프로그램을 작성하시오.

[입력]

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

[출력]

첫째 줄에 사회자가 몇 번째 수를 부른 후 철수가 "빙고"를 외치게 되는지 출력한다.

 


[풀이]

1. 값을 입력받아 담아준다.

2. 들어오는 입력에 맞춰 해당하는 값을 map에서 찾아서 0으로 바꿔준다.

3. 행, 열, 대각선을 탐색해 빙고가 몇개 되었는지 파악해준다.

4. 빙고가 3개 이상인 경우 결과를 출력한다.

[접근]

1. 번호를 부르고 나면 맵을 탐색하며 빙고가 몇 개 있는지 확인하면 되겠다고 생각하였다.

[코드]

import java.io.*;
import java.util.*;

public class Main {
	static int map[][] = new int[5][5];
	static int cnt;
	static int turn = 1;

	public static void main(String[] args) throws Exception {
		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++) {
				map[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 n = Integer.parseInt(st.nextToken());
				
				for (int k = 0; k < 5; k++) {
					for (int l = 0; l < 5; l++) {
						if (map[k][l] == n) {
							map[k][l] = 0;
						}
					}
				}
				
				col(); // 열
				row(); // 행
				diag1(); // 대각 1
				diag2(); // 대각 2
				
				// 3줄 빙고의 경우
				if (cnt >= 3) {
					// 턴 출력 후 종료
					System.out.println(turn);
					System.exit(0);
				}
				
				// 초기화
				cnt = 0;
				// 턴 증가
				turn++;
			}
		}
	}
	
	// 열 체크
	public static void col() {
		for (int i = 0; i < 5; i++) {
			int count = 0;
			
			for (int j = 0; j < 5; j++) {
				if (map[j][i] == 0)
					count++;
				if (count == 5)
					cnt++;
			}
		}
	}
	
	// 행 체크
	public static void row() {
		for (int i = 0; i < 5; i++) {
			int count = 0;
			
			for (int j = 0; j < 5; j++) {
				if (map[i][j] == 0)
					count++;
				if (count == 5)
					cnt++;
			}
		}
	}
	
	// 대각선 체크 (왼쪽 아래 > 오른쪽 위)
	public static void diag1() {
		int count = 0;
		
		for (int i = 0; i < 5; i++) {
			if (map[i][4 - i] == 0)
				count++;
			if (count == 5)
				cnt++;
		}
	}
	
	// 대각선 체크 (왼쪽 위 > 오른쪽 아래)
	public static void diag2() {
		int count = 0;
		
		for (int i = 0; i < 5; i++) {
			if (map[i][i] == 0)
				count++;
			if (count == 5)
				cnt++;
		}
	}
}