Hope Everyone Is Happy

[실버4] 2578. 빙고 (Java) 본문

※ 백준 (Baekjoon)/[Java] 문제 풀이 ( Solve the problems)

[실버4] 2578. 빙고 (Java)

J 크 2023. 7. 28. 17:16
728x90
반응형

 

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

 

2578번: 빙고

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

www.acmicpc.net

bfs 문제인 줄 알고 잘못 풀다가 5x5 사이즈 고정인걸 다시 확인 후 코드 다시 작성 ㅠㅠ. 담부턴 문제 및 코드를 좀 더 꼼꼼하게 확인하겠습니다.


※  문제는 간단합니다. 5x5 크기의 빙고판에 1~25까지의 숫자로 빙고를 진행합니다. 입력은 총 10라인, 라인별 5가지 숫자로, 첫 5라인은 사용자가 작성한 빙고판입니다. 이후 5줄 숫자 5개는 사회자가 발표한 숫자로 입력됩니다. 사용자가 3줄 이상의 빙고가 되었을 때 사회자가 발표한 숫자의 갯수를 출력하면 됩니다.

▶ Example :

◈ Input

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

◈ Output ( 사용자의 빙고가 3줄 이상이 된 순간)

15

 해당 문제는 int형 2차원 배열을 5x5크기로 입력받아 사용자의 빙고판을 받은 후,  사회자의 숫자가 입력 되면 해당 값을 찾아 해당 값이 저장 되어있는 배열 인덱스 숫자들을 찾고, boolean형 2차원 배열 5x5크기에 대입하여 true면 사회자가 체크한 숫자로 확인 될 수 있도록 설계하였습니다.

 빙고의 탐색 방법은 사용자가 값을 불러 줄 때마다 가로, 세로, 대각선을 차례대로 탐색하여 빙고의 갯수가 3개가 되었을 때 사회자가 번호를 부른 횟수를 출력하고 프로그램을 종료하였습니다. 

 ◎  코드 작성 전, 아래와 같이 솔루션을 정리하였습니다.

▶ int 형 5x5, boolean 형 5x5 2차원 배열 선언

▶ int 형 배열에 사용자 빙고값을 입력

▶ 사회자가 입력한 숫자를 찾아 해당 인덱스를 가지는 boolean 배열을 true로 전환

▶ 사회자의 숫자가 들어올 때마다 빙고를 체크 (함수 선언)

▶ 빙고 체크는 가로, 세로, 대각선으로 진행. 한 줄씩 탐색할 때마다 false 발견 시 다음 줄 검색

▶ 사회자의 숫자가 들어올 때마다 빙고를 체크 (함수 선언) 

▶ 대각선의 경우 2,2 좌표의 배열을 중심으로 북서, 남동 방향 탐색 후 북동,남서 방향 탐색

 ( 5x5에서 대각선 빙고는 2개만 존재)

import java.util.Scanner;

public class Main {
	public static boolean isBingo(boolean[][] barrTemp) {
		int nBingoCount = 0;
		boolean bSearch = false;
		
		// 가로 탐색
		for(int i = 0; i < barrTemp.length; i++) {
			bSearch = true;
			for(int j = 0; j < barrTemp[0].length ; j++) {
				if(!barrTemp[i][j]) {
					bSearch = false;
					break;
				}
			}
			if(bSearch)
				nBingoCount++;
		}
		
		// 세로 탐색
		for(int j = 0; j < barrTemp[0].length; j++) {
			bSearch = true;
			for(int i = 0; i < barrTemp.length ; i++) {
				if(!barrTemp[i][j]) {
					bSearch = false;
					break;
				}
			}
			
			if(bSearch)
				nBingoCount++;
		}
		// 북서, 남동 , 북동, 남서
		int[] dr = {-1, 1, -1,  1};
		int[] dc = {-1, 1,  1, -1};
		
		int nIndex= 0;
		for(int i = 0; i < 2; i++) {
			// 대각선 탐색
			int nRowPoint1 = 2;
			int nColPoint1 = 2;
			int nRowPoint2 = 2;
			int nColPoint2 = 2;
			
			bSearch = true;
			for(int j = 0; j < 2; j++) {
				nRowPoint1 += dr[nIndex];
				nColPoint1 += dc[nIndex];
				
				nRowPoint2 += dr[nIndex + 1];
				nColPoint2 += dc[nIndex + 1];
				
				if(!barrTemp[nRowPoint1][nColPoint1] || !barrTemp[nRowPoint2][nColPoint2]) {
					bSearch = false;
					break;
				}
			}
			if(bSearch)
				nBingoCount++;
			
			nIndex += 2;
		}
		
		if(nBingoCount >= 3)
			return true;
		else
			return false;
	}
	
	public static void main(String[] args) {
		 
		Scanner sc = new Scanner(System.in);
		
		int[][] arrBingo = new int[5][5];
		boolean[][] bBingos = new boolean[5][5];
		
		
		// 빙고판 데이터 삽입.
		for(int i = 0 ; i < 5; i++) {
			for(int j = 0; j < 5; j++) {
				arrBingo[i][j] = sc.nextInt();
			}
		}
		
		// 사회자 숫자 호출
		for(int k = 1; k <= 25; k++) {
			int nBingoIndex = sc.nextInt();
			// 해당 숫자로 boolean 인덱스 찾기
			for(int i = 0 ; i < 5; i++) {
				for(int j = 0; j < 5; j++) {
					if(arrBingo[i][j] == nBingoIndex) {
						bBingos[i][j] = true;
						break;
					}
				}
			}
			if(isBingo(bBingos)) {
				System.out.println(k);
				return;
			}
			
		}
	}
}

 처음에 문제 잘못 풀어서 bfs로 풀어보려다가 시간 날리고, 대각선 방향 탐색 인덱스 값을 잘못 설정해놔서 찾다가 시간날리고 ㅠㅠ 앞으로도 문제 풀이시 코드 및 설계를 더 꼼꼼하게 확인해야겠습니다.

긴 글 읽어주셔서 감사합니다!

Good Luck! (피드백 고맙습니다)