본문 바로가기
PS 문제 풀이/Baekjoon

[BOJ] 백준 2578 빙고

by 까망 하르방 2021. 2. 17.
반응형

출처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;
        }
    }
}

 

반응형

댓글