[Algorithm/Java] 백준 2578번 - 빙고
https://www.acmicpc.net/problem/2578
🔍 문제 풀이
문제 도식화
- 사회자가 숫자 부를 때마다
cnt++
- 부른 숫자를 빙고판에서 찾아서 해당 위치 값을 0으로 변경 (markChange)
nxn
(빙고판 전체)을 탐색하며, →↓↘↙ 이 네가지 방향 중 0이 5번 연속 ->Bingo++
checkBingo()
의 반환값이 3 이상이면,cnt
를 출력하고 종료
배운 점
각 방향에 대해 0의 개수를 어떻게 체크해야 할지 헤맸는데,
가로는 paper[i][j]
, 세로는 paper[j][i]
,
↘ 대각선은 paper[i][i]
, ↙ 대각선은 paper[i][4 - i]
이렇게
각 방향마다 인덱스를 어떻게 설정해야 할지 명확히 이해할 수 있었다.
💻 전체 코드
import java.io.*;
import java.util.*;
public class Main {
static int[][] paper;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int cnt = 0;
paper =new int[5][5];
// 빙고판 입력
for(int i=0; i<5; i++){
StringTokenizer st = new StringTokenizer(br.readLine());
for(int j=0; j<5; j++){
paper[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 x = Integer.parseInt(st.nextToken());
cnt ++;
markChange(x);
int bingo = checkBingo();
if(bingo >= 3){
System.out.println(cnt);
return;
}
}
}
}
// 사회자가 부른 숫자를 0으로 바꾸기
static void markChange(int x){
for(int i=0; i<5; i++){
for(int j=0; j<5; j++){
if(paper[i][j] == x){
paper[i][j] = 0;
}
}
}
}
// 빙고 줄 계산
static int checkBingo(){
int bingo = 0;
// →
for(int i=0; i<5; i++){
int check = 0;
for(int j=0; j<5; j++){
if(paper[i][j]== 0) check++;
}
if(check == 5) bingo++;
}
// ↓
for(int i=0; i<5; i++){
int check = 0;
for(int j=0; j<5; j++){
if(paper[j][i]== 0) check++;
}
if(check == 5) bingo++;
}
// ↘
int check = 0;
for(int i=0; i<5; i++){
if(paper[i][i] == 0) check ++;
}
if (check == 5) bingo++;
// ↙
check = 0;
for(int i=0; i<5; i++){
if(paper[i][4-i] == 0) check++;
}
if (check == 5) bingo++;
return bingo;
}
}
댓글남기기