Algorithm/BOJ
BOJ_2578_빙고
wow
2021. 3. 5. 21:38
문제 분석
- 그대로 구현하면 되는데, 세부 조건들까지 잘 고려해서 풀이해야하니까 조금 까다로웠다.
1) 시간을 줄이기 위해 행,열,양쪽 대각선에 빙고가 되는지 확인하는 메소드를 빙고 3줄이 만들어지기 위한 최소 갯수 12개부터 실행하도록 한다. (문제 맨 아래 그림 참고)
2) 빙고는 3줄이되면 벗어나지만 하나를 칠했을 때 두 줄이 빙고가 되는 경우도 있기 때문에 ==이 아닌 >= 조건을 사용한다.
문제 풀이
1) 빙고판을 설정한다.
2) 사회자가 불러주는 번호를 빙고판에서 0처리한다.
3) 빙고가 3줄 이상이 되는지 행,열,양쪽 대각선을 확인한다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
private static int[][] map;
private static int bingo, idx;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
map = new int[5][5];
for (int i = 0; i < 5; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < 5; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
for (int i = 0; i < 5; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < 5; j++) {
idx++;
chk(Integer.parseInt(st.nextToken()));
if (idx >= 12) // 12번째 숫자부터 최소한의 숫자로 3줄의 빙고를 만들 수 있으니까
bingo();
if (bingo >= 3) {
System.out.println(idx);
System.exit(0);
}
}
}
}// main
private static void chk(int num) {
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (map[i][j] == num) {
map[i][j] = 0;
return;
}
}
}
}// chk
private static void bingo() {
bingo =0;
boolean r = true;
// 행에 빙고가 있는지 확인
for (int i = 0; i < 5; i++) {
r = true;
for (int j = 0; j < 5; j++) {
if (map[i][j] != 0) {
r = false;
}
}
if (r) {
bingo++;
if (bingo >= 3)
return;
}
}
boolean c = true;
// 열에 빙고가 있는지 확인
for (int i = 0; i < 5; i++) {
c = true;
for (int j = 0; j < 5; j++) {
if (map[j][i] != 0) {
c = false;
}
}
if (c) {
bingo++;
if (bingo >= 3)
return;
}
}
boolean down = true;
// 대각선아래방향에 빙고가 있는지 확인
for (int i = 0; i < 5; i++) {
if (map[i][i] != 0) {
down = false;
}
}
if (down) {
bingo++;
if (bingo >= 3)
return;
}
boolean up = true;
// 대각선 위 방향에 빙고가 있는지 확인
for (int i = 0; i < 5; i++) {
if (map[i][4 - i] != 0) {
up = false;
}
}
if (up) {
bingo++;
if (bingo >= 3)
return;
}
}// bingo
}// class-end