문제 출처 - SW Expert Academy
문제는 여기
2578번: 빙고
첫째 줄부터 다섯째 줄까지 빙고판에 쓰여진 수가 가장 위 가로줄부터 차례대로 한 줄에 다섯 개씩 빈 칸을 사이에 두고 주어진다. 여섯째 줄부터 열째 줄까지 사회자가 부르는 수가 차례대로
www.acmicpc.net
[문제]
빙고 게임은 다음과 같은 방식으로 이루어진다.
먼저 아래와 같이 25개의 칸으로 이루어진 빙고판에 1부터 25까지 자연수를 한 칸에 하나씩 쓴다
다음은 사회자가 부르는 수를 차례로 지워나간다. 예를 들어 5, 10, 7이 불렸다면 이 세 수를 지운 뒤 빙고판의 모습은 다음과 같다.
차례로 수를 지워가다가 같은 가로줄, 세로줄 또는 대각선 위에 있는 5개의 모든 수가 지워지는 경우 그 줄에 선을 긋는다.
이러한 선이 세 개 이상 그어지는 순간 "빙고"라고 외치는데, 가장 먼저 외치는 사람이 게임의 승자가 된다.
철수는 친구들과 빙고 게임을 하고 있다. 철수가 빙고판에 쓴 수들과 사회자가 부르는 수의 순서가 주어질 때, 사회자가 몇 번째 수를 부른 후 철수가 "빙고"를 외치게 되는지를 출력하는 프로그램을 작성하시오.
[입력]
첫째 줄부터 다섯째 줄까지 빙고판에 쓰여진 수가 가장 위 가로줄부터 차례대로 한 줄에 다섯 개씩 빈 칸을 사이에 두고 주어진다. 여섯째 줄부터 열째 줄까지 사회자가 부르는 수가 차례대로 한 줄에 다섯 개씩 빈 칸을 사이에 두고 주어진다. 빙고판에 쓰여진 수와 사회자가 부르는 수는 각각 1부터 25까지의 수가 한 번씩 사용된다.
[출력]
첫째 줄에 사회자가 몇 번째 수를 부른 후 철수가 "빙고"를 외치게 되는지 출력한다.
[풀이]
1. 값을 입력받아 담아준다.
2. 들어오는 입력에 맞춰 해당하는 값을 map에서 찾아서 0으로 바꿔준다.
3. 행, 열, 대각선을 탐색해 빙고가 몇개 되었는지 파악해준다.
4. 빙고가 3개 이상인 경우 결과를 출력한다.
[접근]
1. 번호를 부르고 나면 맵을 탐색하며 빙고가 몇 개 있는지 확인하면 되겠다고 생각하였다.
[코드]
import java.io.*;
import java.util.*;
public class Main {
static int map[][] = new int[5][5];
static int cnt;
static int turn = 1;
public static void main(String[] args) throws Exception {
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++) {
map[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 n = Integer.parseInt(st.nextToken());
for (int k = 0; k < 5; k++) {
for (int l = 0; l < 5; l++) {
if (map[k][l] == n) {
map[k][l] = 0;
}
}
}
col(); // 열
row(); // 행
diag1(); // 대각 1
diag2(); // 대각 2
// 3줄 빙고의 경우
if (cnt >= 3) {
// 턴 출력 후 종료
System.out.println(turn);
System.exit(0);
}
// 초기화
cnt = 0;
// 턴 증가
turn++;
}
}
}
// 열 체크
public static void col() {
for (int i = 0; i < 5; i++) {
int count = 0;
for (int j = 0; j < 5; j++) {
if (map[j][i] == 0)
count++;
if (count == 5)
cnt++;
}
}
}
// 행 체크
public static void row() {
for (int i = 0; i < 5; i++) {
int count = 0;
for (int j = 0; j < 5; j++) {
if (map[i][j] == 0)
count++;
if (count == 5)
cnt++;
}
}
}
// 대각선 체크 (왼쪽 아래 > 오른쪽 위)
public static void diag1() {
int count = 0;
for (int i = 0; i < 5; i++) {
if (map[i][4 - i] == 0)
count++;
if (count == 5)
cnt++;
}
}
// 대각선 체크 (왼쪽 위 > 오른쪽 아래)
public static void diag2() {
int count = 0;
for (int i = 0; i < 5; i++) {
if (map[i][i] == 0)
count++;
if (count == 5)
cnt++;
}
}
}
'문제 풀이 > Baekjoon' 카테고리의 다른 글
[백준] S5 14582번 오늘도 졌다 (JAVA) (0) | 2022.07.01 |
---|---|
[백준] S1 14716번 현수막 (JAVA) (0) | 2022.06.29 |
[백준] S4 2799번 블라인드 (JAVA) (0) | 2022.06.27 |
[백준] S5 2161번 카드1 (JAVA) (0) | 2022.06.26 |
[백준] S1 2002번 추월 (JAVA) (0) | 2022.06.25 |