[백준] 2578번 빙고 / C++

SmileJun·2025년 2월 26일

알고리즘

목록 보기
5/34

문제 : https://www.acmicpc.net/problem/2578

아이디어 코드

#include<iostream>
using namespace std;

int main() {
    int bingo[6][6];
    int check[6][6] = {0};
    int number;
    int total = 0;
    int sum = 0;

    for(int i = 0 ; i < 5; i++) {
        for(int j = 0; j < 5; j++) {
            cin >> bingo[i][j];
        }
    }

    for(int k = 0; k < 25; k++) {
        cin >> number;
        for(int a = 0; a < 5; a++) {
            for(int b = 0; b < 5; b++) {
                if(bingo[a][b] == number) {
                    check[a][b] = 1;
                    sum += 1;
                }
            }
            for(int c = 0; c < 5; c++) {
                if( (check[c][0] == 1 && check[c][1] == 1 && check[c][2] == 1 && check[c][3] == 1 && check[c][4] == 1)
                || (check[0][c] == 1 && check[1][c] == 1 && check[2][c] == 1 && check[3][c] == 1 && check[4][c] == 1)
                || (check[0][0] == 1 && check[1][1] == 1 && check[2][2] == 1 && check[3][3] == 1 && check[4][4] == 1)
                || check[0][4] == 1 && check[1][3] == 1 && check[2][2] == 1 && check[3][1] == 1 && check[4][0] == 1) {
                    total += 1;
                }
            }
            if(total == 3) {
                cout << sum << endl;
            }
        }

    }
}

C++

#include<iostream>
using namespace std;

int bingo[5][5];
int check[5][5];

int ch1() {
    int ans = 0;
    for(int i = 0; i < 5; i++) {
        if(check[i][0] && check[i][1] && check[i][2] && check[i][3] && check[i][4])
            ans++;
    }
    return ans;
}

int ch2() {
    int ans = 0;
    for(int i = 0; i < 5; i++) {
        if(check[0][i] && check[1][i] && check[2][i] && check[3][i] && check[4][i])
            ans++;
    }
    return ans;
}

int ch3() {
    int ans = 0;

    if(check[0][0] && check[1][1] && check[2][2] && check[3][3] && check[4][4])
        ans++;

    return ans;
}

int ch4() {
    int ans = 0;

    if(check[0][4] && check[1][3] && check[2][2] && check[3][1] && check[4][0])
        ans++;

    return ans;
}

int main() {
   ios::sync_with_stdio(0);
   cin.tie(0);

   for(int i = 0; i < 5; i++) {
       for(int j = 0; j < 5; j++) {
           cin >> bingo[i][j];
       }
   }

   for(int k = 0; k < 25; k++) {
       int number;
       cin >> number;
       int total = 0;

       for(int a = 0; a < 5; a++) {
           for(int b = 0; b < 5; b++) {
               if(bingo[a][b] == number) {
                   check[a][b] = 1;
               }
           }
       }

       total += ch1(); total += ch2(); total += ch3(); total += ch4();

       if(total >= 3) {
           cout << k + 1 << endl;
           return 0;
       }
   }
}

문제풀이

  • 25개의 숫자를 각 빙고 자리에 넣은 뒤, 하나씩 소거해 나간다. 따라서 빙고판에 해당하는 배열 하나와, 소거할 때마다 값을 1로 바꿔주는 또다른 배열 하나를 만들었다. 그런 뒤, 가로줄 세로줄 대각선 줄 빙고에 해당하는 함수를 만들었다. 그리고 빙고 개수가 3개 이상일 때 k값을 출력했다.

Comment

  • 빙고판을 만들고, 해당하는 값을 1로 바꾼다까지는 생각했는데 어떻게 빙고 줄을 카운트할지 고민했다. 그래서 처음에는 마구잡이로 if문에 다 넣었다면, 그 이후에는 각 조건에 해당하는 함수를 따로 만들어줬다.
profile
하루하루는 성실하게, 인생 전체는 되는대로

0개의 댓글