가능할지는 모르겠지만 오늘부터 파이썬과 자바 두가지 언어로 풀어보도록 하겠다!
파이썬 업데이트 예정
자바는 최대한 객체 지향적으로(?) 작성예정
문제
백준 2578
input
output

차례로 수를 지워가다가 같은 가로줄, 세로줄 또는 대각선 위에 있는 5개의 모든 수가 지워지는 경우 그 줄에 선을 긋는다.
그어진 선이 3개면 빙고! 이다. -> 몇번째 수를 부른 후
문제 유형: 시뮬레이션
- int[][] board: 빙고판을 저장
- boolean[][] checkBoard: 숫자 불렸는지 불리지 않았는지 여부 체크
- Map<Integer, int[]> numPositions: 각 숫자의 위치를 저장
- List <Integer> calls: 사회자가 부르는 숫자를 저장
checkLine:
주어진 방향으로 5개의 칸이 모두 체크되었는지 확인.
-BFS나 DFS 로 해결해야 했나 고민. -> 호명되는 숫자의 순서 이미 확정이기 때문에 그냥 반복문을 이용해서 빙고 게임하듯 구현하는게 나을 듯.
import java.io.*;
import java.util.*;
public class Main {
int[][] board = new int[5][5];
boolean[][] checkBoard = new boolean[5][5];
Map<Integer, int[]> numPositions = new HashMap<>();
List<Integer> calls = new ArrayList<>();
public static void main(String[] args) throws IOException {
new Main().solution();
}
void solution() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 빙고판 입력
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());
board[i][j] = num;
numPositions.put(num, new int[]{i, j});
}
}
// 사회자가 부르는 숫자 입력
for (int i = 0; i < 5; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j = 0; j < 5; j++) {
calls.add(Integer.parseInt(st.nextToken()));
}
}
System.out.println(solveBingo());
}
int solveBingo() {
for (int i = 0; i < calls.size(); i++) {
int num = calls.get(i);
int[] pos = numPositions.get(num);
checkBoard[pos[0]][pos[1]] = true;
if (checkBingo()) {
return i + 1;
}
}
return 25;
}
boolean checkBingo() {
int bingoCount = 0;
// 가로, 세로 라인 확인
for (int i = 0; i < 5; i++) {
if (checkLine(i, 0, 0, 1)) bingoCount++;
if (checkLine(0, i, 1, 0)) bingoCount++;
}
// 대각선 확인
if (checkLine(0, 0, 1, 1)) bingoCount++;
if (checkLine(0, 4, 1, -1)) bingoCount++;
return bingoCount >= 3;
}
boolean checkLine(int startX, int startY, int dx, int dy) {
for (int i = 0; i < 5; i++) {
if (!checkBoard[startX + i * dx][startY + i * dy]) {
return false;
}
}
return true;
}
}