[BOJ/백준] 2578번: 빙고 (c++)

devguri·2023년 2월 18일
0
post-thumbnail

2578: 빙고 문제 링크

문제

25개의 칸으로 이루어진 빙고판에 1부터 25까지 자연수를 한 칸에 하나씩 쓴다. 차례로 수를 지워가다가 같은 가로줄, 세로줄 또는 대각선 위에 있는 5개의 모든 수가 지워지는 경우 그 줄에 선을 긋는다. 이러한 선이 세 개 이상 그어지는 순간 "빙고"라고 외치는데, 가장 먼저 외치는 사람이 게임의 승자가 된다.

철수는 친구들과 빙고 게임을 하고 있다. 철수가 빙고판에 쓴 수들과 사회자가 부르는 수의 순서가 주어질 때, 사회자가 몇 번째 수를 부른 후 철수가 "빙고"를 외치게 되는지를 출력하는 프로그램을 작성하시오.

간단하게 -> 빙고 줄이 세 개 이상 주어지는 순간 빙고를 몇 번째에 하는지를 작성한다.

입력

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

출력

첫째 줄에 사회자가 몇 번째 수를 부른 후 철수가 "빙고"를 외치게 되는지 출력한다.

✔️Solution

  1. 사회자가 부르는 숫자마다 줄이 그어지는지 체크하는 함수를 호출한다.(findLocation, lineCheck)
  2. findLocation -> 현재 input의 행과 열의 위치를 구한다.
  3. lineCheck에서 행과 열의 정보를 통해 줄이 생기는지 체크한다.
    • 이때 check라는 배열을 만들어서 1~5까지는 행에서 생긴 줄이 그어졌는지를 체크하고, 6~10까지는 열에서 생긴 줄이 그어졌는지 체크하고, 11에서는 왼쪽 대각선, 12에서는 오른쪽 대각선에서 줄이 생겼는지 체크한다.
  4. check라는 배열을 통해 체크된 개수가 3개 이상인 경우, 1을 반환하여 몇 번째에 불렀는지를 출력한다.

findLocation

void findLocation(int num, vector<vector<int>> &bingo){

    for(int i=1; i<=5; i++){
        for(int j=1; j<=5; j++){
            if(bingo[i][j] == num){
                row = i;
                col = j;
                return;
            }
        }
    }
}

현재 사회자가 부른 input값의 위치를 알아낸다.

lineCheck 함수

int lineCheck(vector<vector<int>> &check) {
    int row_num = 0, col_num = 0, right_num = 0, left_num = 0;
    int cnt=0;

    check[row][col] = 1;

    for (int i = 1; i <= 5; i++) {
        if (check[row][i]) {
            row_num++;
        }

        if (check[i][col]) {
            col_num++;
        }

        if (row + col == 6 && check[i][6 - i]) { // 왼쪽 대각선 체크
            left_num++;
        }

        if (row - col == 0 && check[i][i]) { // 오른쪽 대각선 체크
            right_num++;
        }
    }

    if (col_num == 5 && lines[col + 5] == 0)
        lines[col + 5] = 1;
    if (row_num == 5 && lines[row] == 0)
        lines[row] = 1;
    if (left_num == 5 && lines[11] == 0) // 왼쪽 대각선
        lines[11] = 1;
    if (right_num == 5 && lines[12] == 0) // 오른쪽 대각선
        lines[12] = 1;

    for(int i=1; i<=12; i++){
        if(lines[i] ==1){
            cnt++;
        }

    }

    if(cnt>=3){
        return 1;
    }
    return 0;
}
  • for문에서 현재 체크된 행과 열의 정보를 통해 행, 열, 대각선이 체크되었는지를 확인한다.
  • 그리고 체크한 수가 5일 경우 줄이 생긴 것이므로 if 문을 통해 확인하여 lines 배열에 값을 1로 변경한다.
  • lines 함수를 확인하며 줄이 3개 이상일 경우는 1을 반환하여 현재 사회자가 부른 위치를 출력한다.

이렇게 사회자가 부른 위치를 바로 출력하여 종료할 수 있도록 한다 !

profile
Always live diligently

0개의 댓글

관련 채용 정보