본문 바로가기

Algorithm/Implementation

(C++) - 백준(BOJ) 2578번 : 빙고

반응형

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

 

2578번: 빙고

첫째 줄부터 다섯째 줄까지 빙고판에 쓰여진 수가 가장 위 가로줄부터 차례대로 한 줄에 다섯 개씩 빈 칸을 사이에 두고 주어진다. 여섯째 줄부터 열째 줄까지 사회자가 부르는 수가 차례대로 한 줄에 다섯 개씩 빈 칸을 사이에 두고 주어진다. 빙고판에 쓰여진 수와 사회자가 부르는 수는 각각 1부터 25까지의 수가 한 번씩 사용된다.

www.acmicpc.net

구현문제였습니다.

풀이방법

대각선으로 빙고가 되는 경우를 잘 구현해야하는 문제였습니다.

(3,3)일 때는 오른쪽 아래로 향하는 대각선과 오른쪽 위로 향하는 대각선을 둘 다 봐줘야 합니다.

가로 세로 대각선을 체크하는 함수를 각각 구현하여 이들의 합이 3이상이 되었을 때 종료되게 구현했습니다.

 

 

Code

#include <iostream>
using namespace std;
int bingo[6][6];
int ck[6][6];
//가로
int hor(int x, int y) {
    int cnt = 0;
    for (int i = 1; i <= 5; i++)
        if (ck[x][i] == 1)
            cnt++;
    if (cnt == 5)return 1;
    else return 0;
}
//세로
int ver(int x, int y) {
    int cnt = 0;
    for (int i = 1; i <= 5; i++)
        if (ck[i][y] == 1)
            cnt++;
    if (cnt == 5)return 1;
    else return 0;
}
//대각선 2곳
int diag(int x, int y) {
    int cnt = 0;
    int ans = 0;
    //아래로 대각선
    if (x == y)
    {
        for (int i = 1; i <= 5; i++)
        {
            if (ck[i][i] == 1)
                cnt++;
        }
        if (cnt == 5)
            ans++;
        //(3,3)인 경우에는 대각선이 2개 생기므로 둘 다봐주어야 한다.
        if (x == 3 && y == 3)
        {
            //위로 대각선
            cnt = 0;
            for (int i = 1; i <= 5 - x; i++)
            {
                if (ck[x + i][y - i] == 1)
                    cnt++;
            }
            for (int i = 0; i <= x - 1; i++)
            {
                if (ck[x - i][y + i] == 1)
                    cnt++;
            }
            if (cnt == 5)
                ans++;
        }
    }
    else {
        //위로 대각선
        cnt = 0;
        for (int i = 1; i <= 5 - x; i++)
        {
            if (ck[x + i][y - i] == 1)
                cnt++;
        }
        for (int i = 0; i <= x - 1; i++)
        {
            if (ck[x - i][y + i] == 1)
                cnt++;
        }
        if (cnt == 5)
            ans++;
    }
    return ans;
}
int result(int x, int y) {
    return hor(x, y) + ver(x, y) + diag(x, y);
}
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int num;
    int cnt = 0;
    int seq = 0;
    for (int i = 1; i <= 5; i++)
        for (int j = 1; j <= 5; j++)
            cin >> bingo[i][j];
    for (int i = 1; i <= 25; i++)
    {
        cin >> num;
        seq++;
        //num을 찾기
        for (int k = 1; k <= 5; k++)
        {
            for (int j = 1; j <= 5; j++)
            {
                //해당 숫자 체크
                if (bingo[k][j] == num)
                {
                    ck[k][j] = 1;
                    cnt += result(k, j);
                    if (cnt >= 3)
                    {
                        cout << seq << '\n';
                        return 0;
                    }
                }
            }
        }
    }
}