반응형
출처: https://www.acmicpc.net/problem/2578
Input
11 12 2 24 10
16 1 13 3 25
6 20 5 21 17
19 4 8 14 9
22 15 7 23 18
5 10 7 16 2
4 22 8 17 13
3 18 1 6 25
12 19 23 14 21
11 24 9 20 15
Output
15
사회자가 부르는 숫자를 target[] 배열에 저장합니다.
해당 숫자를 한개씩 빙고판에 mark() 표시하며 visited[][] 표시합니다.
방문 표시가 끝나면 표시(mark)된 곳에서 가로줄, 세로줄을 확인합니다.
마크된 곳과 별개로 대각선 두 곳도 각각 5곳이 칠해지지 않았다면 계속 확인합니다.
▶ 가로줄, 세로줄 (+ 대각선 2개)를 확인했을 때, "bingo"가 3개 이상이면 종료
#include <stdio.h>
struct Node{
int x, y;
}pos;
int map[5][5], target[25], visited[25][25], bingoCnt;
bool isdiagonal1, isdiagonal2;
void chkDiagonal1() {
if (isdiagonal1) return;
int x = 0, y = 0;
for (int i = 0; i < 5; ++i) {
if (!visited[x][y]) return;
x++, y++;
}
isdiagonal1 = true;
bingoCnt++;
}
void chkDiagonal2() {
if (isdiagonal2) return;
int x = 4, y = 0;
for (int i = 0; i < 5; ++i) {
if (!visited[x][y]) return;
x--, y++;
}
isdiagonal2 = true;
bingoCnt++;
}
void mark(int val) {
for (int i = 0; i < 5; ++i) {
for (int j = 0; j < 5; ++j) {
if (map[i][j] == val) {
pos = { i, j };
visited[i][j] = 1;
return;
}
}
}
}
int main() {
// freopen("input.txt", "r", stdin);
for (int i = 0; i < 5; ++i) {
for (int j = 0; j < 5; ++j) {
scanf("%d", &map[i][j]);
}
}
for (int i = 0; i < 25; ++i) {
scanf("%d", &target[i]);
}
int cnt;
for (int pivot = 0; pivot < 25; ++pivot) {
mark(target[pivot]);
// 가로줄 확인
cnt = 0;
for (int j = 0; j < 5; ++j) {
if (!visited[pos.x][j]) break;
cnt++;
}
if (cnt == 5) bingoCnt++;
// 세로줄 확인
cnt = 0;
for (int i = 0; i < 5; ++i) {
if (!visited[i][pos.y]) break;
cnt++;
}
if (cnt == 5) bingoCnt++;
// 대각선 확인
chkDiagonal1();
chkDiagonal2();
if (bingoCnt >= 3) {
printf("%d\n", pivot + 1);
break;
}
}
}
반응형
'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글
[BOJ] 백준 2666 벽장문의 이동 (0) | 2021.02.17 |
---|---|
[BOJ] 백준 2668 숫자 고르기 (0) | 2021.02.17 |
[BOJ] 백준 2502 떡 먹는 호랑이 (0) | 2021.02.17 |
[BOJ] 백준 2621 카드 게임 (0) | 2021.02.17 |
[BOJ] 백준 10801 카드게임 (0) | 2021.02.17 |
댓글