[ baekjoon ] #2578 빙고

eunheelog·2023년 6월 20일
0

baekjoon

목록 보기
8/20

백준 #2578 빙고

문제 요약


  • 25개의 칸으로 이루어진 빙고 판에 1 ~ 25까지의 자연수를 한 칸에 하나씩 쓴다.
  • 사회자가 부르는 순서대로 지운다.
  • 지워가다가 같은 가로줄, 세로줄, 또는 대각선 위에 있는 5개의 모든 수가 지워지면 선을 긋는다.
  • 선이 세 개 이상 그어지는 순간 "빙고"라고 외친다.
  • 몇 번째 수를 부른 후 "빙고"를 외치는지 구하기 !

💡Idea


  1. 철수와 사회자의 빙고를 따로 만들자.
  2. 빙고인지 어떻게 확인할까?
    → 이미 불린 숫자인지 확인하기 위해 check 배열 생성
    → 숫자를 지웠다면 해당 위치의 check 값을 1로 바꿈
    → 숫자를 하나 부를때마다 빙고인지 확인해보기 !

[ SourceCode ]

#include <iostream>
#include <map>
using namespace std;

int check[5][5];

int bingo_check() {
    int cnt = 0;
  	// 가로, 세로 빙고 체크
    for(int i=0; i<5; i++) {
        int col_flag = 0, row_flag = 0;
        for(int j=0; j<5; j++) {
            if(check[i][j]) col_flag++;
            if(check[j][i]) row_flag++;
        }
        if(col_flag == 5) cnt++;
        if(row_flag == 5) cnt++;
    }

    // 대각선 빙고 체크
    int left_cross = 0, right_cross = 0;
    for(int i=0; i<5; i++) {
        if(check[i][i]) left_cross++;
        if(check[4-i][i]) right_cross++;
    }

    if(left_cross == 5) cnt++;
    if(right_cross == 5) cnt++;

    return cnt;
}

int main() {
    int bingo_cheolsu[5][5], bingo_order[5][5]; // 철수의 빙고, 사회자의 빙고
    map <int, pair<int, int>> pos;
    for(int i=0; i<5; i++) {
        for(int j=0; j<5; j++) {
            cin >> bingo_cheolsu[i][j];
            pos.insert({bingo_cheolsu[i][j], {i, j}});
        }
    }

    for(int i=0; i<5; i++) {
        for(int j=0; j<5; j++) {
            cin >> bingo_order[i][j];
            pair <int, int> idx = pos[bingo_order[i][j]];
            check[idx.first][idx.second] = 1;
            if(bingo_check() >= 3) {
                cout << i * 5 + (j+1);
                exit(0);
            }
        }
    }

    return 0;
}

Feedback


  1. 처음에는 5개씩 지우고 난 뒤 빙고인지 확인하였는데 생각해보니 15개 이후로는 하나씩 다 확인해줘야한다.
    → 일관성 있게 하나 지울 때마다 빙고인지 확인해주었다 !
    (5x5밖에 안되기 때문에,,)
  2. 빙고 여부를 선이 3개일 때 출력하도록 하였다.
    → 무조건 빙고가 3줄이 나올거란 보장은 없다,,
    → 문제에도 3줄 이상일 때 빙고라고 한다.
    → 당연하다는 생각은 버리자 !!!
profile
⛧1일 1알고리즘⛧

0개의 댓글