🌞Algorithm/🔥Baekjoon

[Baekjoon] 2578_빙고

뿌야._. 2024. 2. 6. 21:44

Silver IV

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

< 빙고 >

 

문제 풀이 

 

사회자가 숫자를 부를 때마다 빙고 여부 확인한다.

 

 

 my solution (Java)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class _2578_ { // 빙고
	static int arr[][], line;
	static boolean check1, check2;

	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;

		arr = new int[5][5];
		for (int i = 0; i < 5; i++) {
			st = new StringTokenizer(bf.readLine());
			for (int j = 0; j < 5; j++) {
				arr[i][j] = Integer.parseInt(st.nextToken());
			}
		}

		line = 0;
		check1=false;
		check2=false;
		boolean flag = false;
		for (int i = 0; i < 5; i++) {
			st = new StringTokenizer(bf.readLine());
			for (int j = 1; j <= 5; j++) {
				int num = Integer.parseInt(st.nextToken());
				int position[] = find(num);

				if ((5 * i) + j >= 5) {
					bingo(position[0], position[1]);
					if (line >= 3) {
						flag = true;
						System.out.println((5 * i) + j);
						break;
					}
				}
			}
			if (flag) {
				break;
			}
		}
	}

	private static void bingo(int x, int y) {
		int cnt = 0;

		// 가로
		for (int i = 0; i < 5; i++) {
			if (arr[x][i] != -1) {
				break;
			}
			cnt += 1;
		}
		if(cnt==5) {
			line+=1;
		}

		// 세로
		cnt=0;
		for(int i=0; i<5; i++) {
			if(arr[i][y] !=-1) {
				break;
			}
			cnt+=1;
		}
		if(cnt==5) {
			line+=1;
		}

		// 대각선
		if(!check1 && arr[0][0]==-1 && arr[1][1]==-1 && arr[2][2]==-1 && arr[3][3]==-1 && arr[4][4]==-1) {
			check1=true;
			line+=1;
		}

		if(!check2 && arr[0][4]==-1 && arr[1][3]==-1 && arr[2][2]==-1 && arr[3][1]==-1 && arr[4][0]==-1) {
			check2=true;
			line+=1;
		}

	}

	private static int[] find(int num) {
		for (int i = 0; i < 5; i++) {
			for (int j = 0; j < 5; j++) {
				if (arr[i][j] == num) {
					arr[i][j] = -1;
					return new int[] { i, j };
				}
			}
		}
		return null;
	}
}
변수)
arr : 빙고판 정보
line : 빙고 수
check1, check2 : 대각선 빙고 여부
flag : 빙고 여부
num : 사회자가 부르는 수
position : 사회자가 부르는 수의 빙고판 위치

 

빙고판 정보를 입력받아 arr에 저장한다. 사회자가 숫자를 부를 때마다 빙고판에서 숫자의 위치를 찾아 빙고 여부를 확인한다. 3줄 이상 그어졌다면 빙고이므로 정답을 출력하고 종료한다.

 

bingo(좌표)

가로 빙고, 세로 빙고, 대각선 빙고를 확인한다.

 

find(숫자)

사회자가 부른 숫자를 빙고판에서 찾아 -1로 바꾼 후 숫자 위치를 반환한다.



 

'🌞Algorithm > 🔥Baekjoon' 카테고리의 다른 글

[Baekjoon] 3758_KCPC  (0) 2024.02.08
[Baekjoon] 3085_사탕 게임  (0) 2024.02.07
[Baekjoon] 19238_스타트 택시  (1) 2024.02.05
[Baekjoon] 1167_트리의 지름  (1) 2024.02.02
[Baekjoon] 11967_불켜기  (0) 2024.02.01