자료구조&알고리즘/백준

[JAVA] 2578번 - 빙고

celinayk 2024. 8. 12. 23:56
반응형

문제 탐색하기

- 문제에서 구해야 하는 최종 정답은 무엇인지 탐색한 과정
- 그 정답을 구하기 위해 어떻게 코드를 구현해야 할지 고민한 과정
- 문제에 들어오는 범위를 파악하여 어떤 알고리즘을 쓸 수 있을지 고민해 가는 과정

 

일단 빙고판은 이차원 배열로 구현할 수 있다.

이차원 배열에 숫자를 채워넣어준다.

그리고 x표시를 해야하는데 이거는 이차원배열의 숫자를 0으로 바꾸는걸로 접근을 해볼생각이다.

그리고 0으로 바꿔질때마다(=사회자가 부른 숫자를 지울때마다) 내가 속한 i,j의 라인이 전부 0인지

체크를 하면서 라인 하나가 전부 0이면 cnt를 해주고, cnt가 3일될때의 0의 갯수를 세면 되지 않을까

라고 처음에 생각했다.

 

 

어떻게 해야 사회자가 부른 값을 표시할까?

= 기존 빙고판에 있는 숫자를 0으로 바꿔준다

 

한줄이 완성된건 어떻게 확인할까?

= 각 라인이 전부  0인걸 체크해서 전부0이면 한줄이 완성된것이다 그러면 cnt++한다 

 

가로확인: 한 행만 체크하면된다 

세로확인: 가로처럼 한 열만 체크하면된다

대각선확인: 여기서 고민이 많았다 

 

일단 기본적인 설계는 이렇게 하면 될것이라고 생각해서 코드를 설계했다

 

코드 설계하기

위의 문제 탐색하기에서 고민한 과정을 토대로 문제 풀이에 대한 실마리를 잡았다면, 문제 풀이를 본격적으로 하기전, 문제를 풀이 위한 로드맵을 그려본다
어떤 순서로 코드를 작성해야 할지, 어떤 함수들을 작성해야 할지 등을 작성

 

1. 숫자를 입력받아 이차원배열의 빙고판을 채운다

2. 사회자가 부르는 숫자를 25번 반복하면서 쭉 입력받음과 동시에 이중for문을 돌면서

빙고판의 숫자가 사회자가 부르는 숫자와 같으면 그 빙고판을 0으로 바꾸고, cnt++한다

cnt를 + 하는 이유는 빙고기 되었을때 몇번 +되었는지 정답을 출력해야하기 때문이다

그리고 동시에 오른쪽체크,왼쪽, 대각선체크를 한다

3. ans가 3이상이면 빙고이기때문에 이때의 사회자가 부르는 숫자가 몇번쨰인지 출력한다

 

**가로**

boolean타입을 true로 선언해놓고, if조건문으로 0이아닌지 체크한다

0이 아니라면 그 줄은 아예 빙고가 될 수 없으므로 false라고 체크하고 다음 줄로 넘어간다

그렇게 해서 계속 true인 줄이 빙고이므로 +해준다 

 

**세로**

가로랑 동일하되 조건문이 arr[j][i]가 된다 열을 기준으로 체크해야하니까! 

 

**대각선은 두개다**

1. 왼쪽위에서 오른쪽아래

이건 arr[i][i]를 통해 조건을 검사하면된다

2. 오른쪽위에서 왼쪽아래

직접 적어보면 규칙을 알 수 있다

arr[0][4]

arr[1][3]

arr[2][2]

arr[3][1]

arr[4][0]

이다. arr[i][4-i]의 규칙이다 

 

시도 회차 수정 사항

- 무분별하게 "맞았습니다" 가 나올때까지 수정하는 형태의 문제 풀이를 반복하면, 내가 어떤 실수를 해서 해당 문제를 틀렸는지 모르게 된다
- 틀렸습니다를 받았다면 왜 틀렸는지 고민핸보고, 어떻게 수정할 수 있는지 고민하는 과정을 작성
- 위에 내가 세울 설계에서 어떤 부분이 틀렸는지도 함께 점검
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;

public class Main {
	static int arr[][] = new int[5][5];  
	static int ans = 0;
	public static void main(String[] args) throws Exception, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));	
		
		int cnt=0;
		
		// 빙고판 입력
		for(int i=0; i<5; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			for(int j=0; j<5; j++) {
				arr[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 num = Integer.parseInt(st.nextToken());
				
				// 사회자가 부른값과 빙고판 숫자가 같으면 0으로 변경
				for(int k=0; k<5; k++) {
					for(int l=0; l<5; l++) {
						if(arr[k][l]==num) {
							arr[k][l] = 0;
							cnt++;
						}
					}
				}
				
		
				//만약 ans가 3이상이면 빙고이기때문에 종료
				if (check() >= 3) {
                    System.out.println(cnt);
                    return;
                }
			}
		}
		
	}
	
	public static int check() {
        int lineCount = 0;

        // 가로줄 체크
        for (int i = 0; i < 5; i++) {
            boolean isBingo = true;
            for (int j = 0; j < 5; j++) {
                if (arr[i][j] != 0) {
                    isBingo = false;
                    break;
                }
            }
            if (isBingo) lineCount++;
        }

        // 세로줄 체크
        for (int i = 0; i < 5; i++) {
            boolean isBingo = true;
            for (int j = 0; j < 5; j++) {
                if (arr[j][i] != 0) {
                    isBingo = false;
                    break;
                }
            }
            if (isBingo) lineCount++;
        }

        // 대각선 체크 (왼쪽 위에서 오른쪽 아래로)
        boolean isBingo = true;
        for (int i = 0; i < 5; i++) {
            if (arr[i][i] != 0) {
                isBingo = false;
                break;
            }
        }
        if (isBingo) lineCount++;

        // 대각선 체크 (오른쪽 위에서 왼쪽 아래로)
        isBingo = true;
        for (int i = 0; i < 5; i++) {
            if (arr[i][4 - i] != 0) {
                isBingo = false;
                break;
            }
        }
        if (isBingo) lineCount++;

        return lineCount;
    }
}