본문 바로가기

Algorithm/BOJ

[BOJ-2578][구현] 빙고 - Java

문제 바로가기

 

2578번: 빙고

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

www.acmicpc.net

 

크게 어렵지 않은 구현 문제입니다.

마찬가지로 하라는 대로 하면 됩니당.

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

public class Main {
	static class Dir{
		int y, x;
		Dir(int y, int x){
			this.y = y; this.x = x;
		}
	}
	static Map<Integer, Dir> board = new HashMap<>();
	static boolean[][] checked = new boolean[5][5];
	
	public static int checkBingos() {
		int cnt = 0;
		int left = 0, right = 0;
		
		for(int i = 0; i < 5; i++) {
			int r = 0, c = 0;
			
			if(checked[i][i]) right++;
			if(checked[i][4 - i]) left++;
			
			for(int j = 0; j < 5; j++) {
				if(checked[i][j]) r++;
				if(checked[j][i]) c++;
			}
			if(r == 5) cnt++; 
			if(c == 5) cnt++;
		}
		if(left == 5) cnt++;
		if(right == 5) cnt++;
		
		return cnt;
	}
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		List<Integer> nums = new ArrayList<>();
		int answer = 0;
		
		for(int i = 0; i < 5; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			for(int j = 0; j < 5; j++) {
				board.put(Integer.parseInt(st.nextToken()), new Dir(i, j));
			}
		}
		
		for(int i = 0; i < 5; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			for(int j = 0; j < 5; j++) {
				nums.add(Integer.parseInt(st.nextToken()));
			}
		}
		
		for(int n : nums) {
			answer++;
			Dir pos = board.get(n);
			checked[pos.y][pos.x] = true;
			if(checkBingos() >= 3) break;
		}
			
		System.out.println(answer);
	}
}

 

사회자가 번호를 불렀을 때 그 번호의 위치를 바로 찾기 위해서 Map<Integer, Dir> 로 빙고판을 만들어 줍시다.

 

25개가 다 불리기 전에 무조건 빙고를 세 개 이상 만들 수 있을테지만 철수는 착해서 다 기다려줍니다.

 

암튼 입력 받은대로 2차원 boolean 배열 checked 에 체크를 해줍시다. 체크할 때마다 빙고가 세 개 완성됐는지 체크해주면서 반복문을 돌리면 됩니다.

 

 

한칸 체크했을 때 바로 빙고가 두 개 이상 만들어 질 수 있음에 유의합시다!!

 

감사합니다 ㅎ.ㅎ