본문 바로가기
Algorithm/백준

[백준] 2578번 : 빙고 / java

by 코딩친구 2020. 9. 24.
반응형

www.acmicpc.net/problem/2578

 

2578번: 빙고

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

www.acmicpc.net

 

[ 코드 ]

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

public class Main {
	
	static int[][] bingo = new int[5][5];
	static int[][] cBingo = new int[5][5];
	static int[][] visited = new int[5][5];
	
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = null;
		int answer = 0;
		
		for(int i=0; i<5; i++) { //bingo판 입력
			st = new StringTokenizer(br.readLine()," ");
			for(int j=0; j<5; j++) {
				bingo[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		for(int i=0; i<5; i++) { //call bingo 입력
			st = new StringTokenizer(br.readLine()," ");
			for(int j=0; j<5; j++) {
				cBingo[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		loop :
		for(int i=0; i<5; i++) {
			for(int j=0; j<5; j++) {
				int tmp = cBingo[i][j];
				answer++; //몇번째 부르는 지
				
				for(int a=0; a<5; a++) {
					for(int b=0; b<5; b++) {
						if(tmp==bingo[a][b]) { //부른것과 같다면
							visited[a][b] = 1;
							if(InArea()==true) break loop;
						}
					}
				}
			}
		}
		
		System.out.println(answer);
	}

	private static boolean InArea() {
		int line = 0;
		int su = 0;
		
		//가로
		for(int i=0; i<5; i++) {
			for(int j=0; j<5; j++) {
				if(visited[i][j]==1) su++;
			}
			if(su==5) line++;
			su = 0;
		}
		
		//세로
		for(int i=0; i<5; i++) {
			for(int j=0; j<5; j++) {
				if(visited[j][i]==1) su++;
			}
			if(su==5) line++;
			su = 0;
		}
		
		//좌->우 대각선
		for(int i=0; i<5; i++) {
			if(visited[i][i]==1) su++;
		}
		if(su==5) line++;
		su = 0;
		
		//우->좌 대각선
		for(int i=0; i<5; i++) {
			if(visited[i][4-i]==1) su++;
		}
		if(su==5) line++;
		su = 0;
		
		if(line>=3) return true;
		return false;
	}
	
}

 

 

대각선에서 따로 세지 않아서 문제였던 것 같다.

다른 풀이에서는 2차원 배열 한 판에서 숫자를 지워나가며 해결했는데,

난 다른 판에 1을 적어나간 뒤 한 줄이 되면 라인을 그리는 전형적인 빙고판을 만들어봤다.

 

 

 

[ 틀린 코드 ]

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

public class bj2578 {
	
	static int[][] bingo = new int[5][5];
	static int[][] cBingo = new int[5][5];
	static int[][] visited = new int[5][5];
	
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = null;
		int answer = 0;
		
		for(int i=0; i<5; i++) { //bingo판 입력
			st = new StringTokenizer(br.readLine()," ");
			for(int j=0; j<5; j++) {
				bingo[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		for(int i=0; i<5; i++) { //call bingo 입력
			st = new StringTokenizer(br.readLine()," ");
			for(int j=0; j<5; j++) {
				cBingo[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		loop :
		for(int i=0; i<5; i++) {
			for(int j=0; j<5; j++) {
				int tmp = cBingo[i][j];
				answer++; //몇번째 부르는 지
				
				for(int a=0; a<5; a++) {
					for(int b=0; b<5; b++) {
						if(tmp==bingo[a][b]) { //부른것과 같다면
							visited[a][b] = 1;
							if(InArea()==true) break loop;
						}
					}
				}
			}
		}
		
		System.out.println(answer);
	}

	private static boolean InArea() {
		int line = 0;
		int su = 0;
		
		//가로
		for(int i=0; i<5; i++) {
			for(int j=0; j<5; j++) {
				if(visited[i][j]==1) su++;
			}
			if(su==5) line++;
			su = 0;
		}
		
		//세로
		for(int i=0; i<5; i++) {
			for(int j=0; j<5; j++) {
				if(visited[j][i]==1) su++;
			}
			if(su==5) line++;
			su = 0;
		}
		
		//대각선
		for(int i=0; i<5; i++) {
			for(int j=0; j<5; j++) {
				if(i==0 && j==0) { //대각선 1
					if(visited[i][j]==1) {
						su++;
						i = i+1;
						j = j+1;
					}
					if(su==5) line++;
					su = 0;
				}
				
				if(i==0 && j==4) { //대각선 2
					if(visited[i][j]==1) {
						su++;
						i = i+1;
						j = j-1;
					}
					if(su==5) line++;
					su = 0;
				}
				
			}
		}
		
		if(line>=3) return true;
		return false;
	}
	
}

 

 

※ 오늘의 교훈

수학문제를 풀 땐 조금 더 신중히 풀어보도록 하자.

반응형