• Baekjoon 2578 빙고 JAVA

    2022. 7. 5.

    by. 순일

     

    2578번: 빙고

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

    www.acmicpc.net

    문제

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

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

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


     

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

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

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

     

    조건

    [입력]

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

     

    [출력]

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

     

    풀이

    해당 문제는 빙고가 되는 최소 턴을 구하는 문제다. 로직은 아래와 같은 순서로 해결하였다.

    1. map에 숫자에 대한 좌표 값을 저장한다.

    2. 사회자가 말하는 수에 해당하는 빙고판을 체크하고 ans를 증가시킨다.

        1. ans가 12 이상이면 체크한다 (최소 빙고 가능 턴 수)

            1. 행, 열, 하향 대각선, 상향 대각선을 체크한다 (반복문으로 체크) 

            2. cnt가 3 이상이면 빙고가 성공한 경우 true 리턴 그렇지 않으면 false 리턴

        2. 리턴 값을 체크해서 최종 출력하고 반복문을 빠져나온다.

     

    코드
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.StringTokenizer;
    
    public class Main {
    
    	static int[][] bingo;
    	public static void main(String[] args) throws Exception{
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		StringTokenizer st = null;
    		
    		bingo = new int[5][5]; // 빙고 판 
    		Map<Integer, int[]> map = new HashMap<>(); //map에 숫자에대한 좌표 정보를 담는다 
    		for (int i = 0; i < 5; i++) {
    			st = new StringTokenizer(br.readLine());
    				for (int j = 0; j < 5; j++) {
    					map.put(Integer.parseInt(st.nextToken()), new int[] {i,j});
    			}
    		}
    		
    		
    		int ans = 0;
    		roop: // 이중 포문을 빠져나오기 위해 사용 체크 포인트 
    		for (int i = 0; i < 5; i++) {
    			st = new StringTokenizer(br.readLine());
    			for (int j = 0; j < 5; j++) {
    				int[] n = map.get(Integer.parseInt(st.nextToken()));
    				bingo[n[0]][n[1]] = 1;
    				ans++;
    				if(ans >= 12 && check()){ // 최소 12턴은 지나야 빙고가 가능 이후부터 빙고 체크  
    					System.out.println(ans);
    					break roop;
    				}
    			}
    		}
    	}
    	private static boolean check() {
    		int cnt = 0, sum = 0;
    		for (int i = 0; i < 5; i++) { // 행 체크 
    			sum = 0;
    			for (int j = 0; j < 5; j++) {
    				sum+= bingo[i][j];
    			}
    			if(sum == 5)
    				cnt++;
    		}
    		
    		for (int i = 0; i < 5; i++) { // 열 체크 
    			sum = 0;
    			for (int j = 0; j < 5; j++) {
    				sum+= bingo[j][i];
    			}
    			if(sum == 5)
    				cnt++;
    		}
    		sum = 0;
    		for (int i = 0; i < 5; i++) { // 하향 대각선 체크 
    			sum+= bingo[i][i];
    		}
    		if(sum == 5)
    			cnt++;
    		
    		sum = 0;
    		for (int i = 0; i < 5; i++) { // 상향 대각선 체크 
    			sum+= bingo[i][4-i];
    		}
    		if(sum == 5)
    			cnt++;
    		
    		if (cnt >= 3)
    			return true;
    		return false;
    	}
    }

     

     

    GitHub - JUNGSOONIL/Algorithm-JAVA: 알고리즘 문제 해결 자바 소스 코드

    알고리즘 문제 해결 자바 소스 코드. Contribute to JUNGSOONIL/Algorithm-JAVA development by creating an account on GitHub.

    github.com

     

    728x90

    '알고리즘 > Baekjoon' 카테고리의 다른 글

    Baekjoon 2933 미네랄 JAVA  (0) 2022.07.08
    Baekjoon 14594 동방 프로젝트 (Small) JAVA  (0) 2022.07.06
    Baekjoon 17135 캐슬 디펜스 JAVA  (0) 2022.06.30
    Baekjoon 12100 2048(Easy) JAVA  (0) 2022.06.29
    Baekjoon 15683 감시 JAVA  (0) 2022.06.28

    댓글