https://www.acmicpc.net/problem/2578
문제
빙고 게임은 다음과 같은 방식으로 이루어진다.
먼저 아래와 같이 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;
}
}
}
}
'알고리즘' 카테고리의 다른 글
백준 4659 비밀번호 발음하기 C++ (0) | 2022.07.21 |
---|---|
백준 2303 숫자 게임 C++ (0) | 2022.07.21 |
백준 2161 카드 1 C++ (0) | 2022.07.18 |
백준 2961 도영이가 만든 맛있는 음식 C++ (0) | 2022.07.17 |
백준 17182 우주 탐사선 C++ (0) | 2022.07.17 |