하루하루 꾸준히, 인생은 되는대로

알고리즘

백준 2578 빙고 C++

긤효중 2022. 7. 18. 21:47

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

 

2578번: 빙고

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

www.acmicpc.net

문제

빙고 게임은 다음과 같은 방식으로 이루어진다.

먼저 아래와 같이 25개의 칸으로 이루어진 빙고판에 1부터 25까지 자연수를 한 칸에 하나씩 쓴다

다음은 사회자가 부르는 수를 차례로 지워나간다. 예를 들어 5, 10, 7이 불렸다면 이 세 수를 지운 뒤 빙고판의 모습은 다음과 같다.


 

차례로 수를 지워가다가 같은 가로줄, 세로줄 또는 대각선 위에 있는 5개의 모든 수가 지워지는 경우 그 줄에 선을 긋는다.

이러한 선이 세 개 이상 그어지는 순간 "빙고"라고 외치는데, 가장 먼저 외치는 사람이 게임의 승자가 된다.

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


입력

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


5*5 빙고판에 1부터 25까지의 숫자가 하나씩 주어진다.

그 다음 줄에 5*5 형태로 사회자가 부르는 숫자가 주어진다.

 

 

빙고가 되는 조건(선이 세 개 이상 그어지는 시점)을 생각해보기 전에 선이 총 4가지 있을 수 있다.

 

1) 가로로 모든 요소가 X일 경우, 

X X X X X
         
         

 

2)세로로 모든 요소가 X일 경우,

X        
X        
X        
X        
X        

 

3)제일 왼쪽부터 마지막 오른쪽 까지 대각선으로 X가 쳐있는 경우

X        
  X      
    X    
      X  
        X

 

4)나머지 대각선

        X
      X  
    X    
  X      
X        

 

이러한 경우를 판별해서 선이 세 개 이상 생기면 빙고이므로, 몇 번쨰 수인지 출력한다.

 

부른 원소를 0으로 만들어서 판별하도록 하였다.

#include <iostream>
using namespace std;

int map[5][5];
int check_bingo(){
    int num_of_bingo = 0; //선이 몇 개 있는지 판별
    
     //첫번쨰 경우(가로로 모두 0인 경우)
    for(int i = 0;i<5;i++){ 
        bool valid = false;
        for(int j = 0;j<5;j++){
            if(map[i][j] != 0){
                valid = true;
                break;
            }
        }
        if(valid == false){
            num_of_bingo++;
        }
    }
    
    //두번쨰 경우(세로로 모두 0인 경우)
    for(int i = 0;i<5;i++){
        bool valid = false;
        for(int j = 0;j<5;j++){
            if(map[j][i] != 0){
                valid = true;
                break;
            }
        }
        if(valid == false){
            num_of_bingo++;
        }
    }
    //세번째 경우 (왼쪽 (1,1)부터 (5,5)까지 대각선이 모두 0인 경우)
   bool valid = false;
    for(int i = 0;i<5;i++){
        if(map[i][i] != 0){
            valid = true;
        }
        if(valid == true){
            break;
        }
    }
    
    if(valid == false){
        num_of_bingo++;
    }
    
    valid = false;
    //마지막 대각선이 모두 0인 경우
    for(int i = 4;i>=0;i--){
        if(map[i][4-i] != 0){
            valid = true;
            break;
        }
    }
    if(valid == false){
        num_of_bingo++;
    }
    
    //선이 세 개 이상이면 빙고
    if(num_of_bingo >= 3){
        return 1;
    }
    //그렇지 않으면 -1 리턴
   return -1;
}
int main(void){
    for(int i = 0;i<5;i++){
        for(int j = 0;j<5;j++){
            cin >> map[i][j];
        }
    }
    
    int first = 1;
    int x;
    
    for(int i = 0;i<5;i++){
        for(int j = 0;j<5;j++){
            
            cin >> x;
            first++;
            bool is_find = false;
            
            for(int k = 0;k<5;k++){
                for(int q = 0;q<5;q++){
                    /*부른 원소를 찾아서 0으로 만든다 */
                    if(map[k][q] == x){
                        is_find = true;
                        map[k][q] = 0;

                    }
                }

            }
            //빙고를 만족 할떄,
            if(check_bingo() == 1){
                cout << first - 1;
                return 0;
            }
        }
    }
}

 

#include <iostream>
using namespace std;

int map[5][5];
int check_bingo(){
    int num_of_bingo = 0; //선이 몇 개 있는지 판별
   
     //첫번쨰 경우(가로로 모두 0인 경우)
    for(int i = 0;i<5;i++){
        bool valid = false;
        for(int j = 0;j<5;j++){
            if(map[i][j] != 0){
                valid = true;
                break;
            }
        }
        if(valid == false){
            num_of_bingo++;
        }
    }
   
    //두번쨰 경우(세로로 모두 0인 경우)
    for(int i = 0;i<5;i++){
        bool valid = false;
        for(int j = 0;j<5;j++){
            if(map[j][i] != 0){
                valid = true;
                break;
            }
        }
        if(valid == false){
            num_of_bingo++;
        }
    }
    //세번째 경우 (왼쪽 (1,1)부터 (5,5)까지 대각선이 모두 0인 경우)
   bool valid = false;
    for(int i = 0;i<5;i++){
        if(map[i][i] != 0){
            valid = true;
        }
        if(valid == true){
            break;
        }
    }
   
    if(valid == false){
        num_of_bingo++;
    }
   
    valid = false;
    //마지막 대각선이 모두 0인 경우
    for(int i = 4;i>=0;i--){
        if(map[i][4-i] != 0){
            valid = true;
            break;
        }
    }
    if(valid == false){
        num_of_bingo++;
    }
   
    //선이 세 개 이상이면 빙고
    if(num_of_bingo >= 3){
        return 1;
    }
    //그렇지 않으면 -1 리턴
   return -1;
}
int main(void){
    for(int i = 0;i<5;i++){
        for(int j = 0;j<5;j++){
            cin >> map[i][j];
        }
    }
   
    int first = 1;
    int x;
   
    for(int i = 0;i<5;i++){
        for(int j = 0;j<5;j++){
           
            cin >> x;
            first++;
            bool is_find = false;
           
            for(int k = 0;k<5;k++){
                for(int q = 0;q<5;q++){
                    /*부른 원소를 찾아서 0으로 만든다 */
                    if(map[k][q] == x){
                        is_find = true;
                        map[k][q] = 0;

                    }
                }

            }
            //빙고를 만족 할떄,
            if(check_bingo() == 1){
                cout << first - 1;
                return 0;
            }
        }
    }
}