문제출처: https://www.acmicpc.net/problem/2578
문제
빙고 게임은 다음과 같은 방식으로 이루어진다.
먼저 아래와 같이 25개의 칸으로 이루어진 빙고판에 1부터 25까지 자연수를 한 칸에 하나씩 쓴다
다음은 사회자가 부르는 수를 차례로 지워나간다. 예를 들어 5, 10, 7이 불렸다면 이 세 수를 지운 뒤 빙고판의 모습은 다음과 같다.
차례로 수를 지워가다가 같은 가로줄, 세로줄 또는 대각선 위에 있는 5개의 모든 수가 지워지는 경우 그 줄에 선을 긋는다.
이러한 선이 세 개 이상 그어지는 순간 "빙고"라고 외치는데, 가장 먼저 외치는 사람이 게임의 승자가 된다.
철수는 친구들과 빙고 게임을 하고 있다. 철수가 빙고판에 쓴 수들과 사회자가 부르는 수의 순서가 주어질 때, 사회자가 몇 번째 수를 부른 후 철수가 "빙고"를 외치게 되는지를 출력하는 프로그램을 작성하시오.
입력
첫째 줄부터 다섯째 줄까지 빙고판에 쓰여진 수가 가장 위 가로줄부터 차례대로 한 줄에 다섯 개씩 빈 칸을 사이에 두고 주어진다. 여섯째 줄부터 열째 줄까지 사회자가 부르는 수가 차례대로 한 줄에 다섯 개씩 빈 칸을 사이에 두고 주어진다. 빙고판에 쓰여진 수와 사회자가 부르는 수는 각각 1부터 25까지의 수가 한 번씩 사용된다.
출력
첫째 줄에 사회자가 몇 번째 수를 부른 후 철수가 "빙고"를 외치게 되는지 출력한다.
풀이
100퍼센트 구현문제입니다. 사회자가 숫자를 부를 때 마다 빙고인지 아닌지 행,열,대각선 모두 검사해야합니다. 빙고를 확인하는 검사는 행 빙고 검사, 열 빙고 검사, 대각선(좌->우), (우->좌) 총 4가지입니다. 이것을 소스로 구현하면 끝입니다. 중요한 건 42행, 52행 처럼 바깥for문내에 sum을 0으로 초기화 시켜야 그 행 or 열 라인의 빙고를 판별 할 수 있습니다. 대각선 검사는 총 두번밖에안되므로, 그리고 규칙성을 가지므로(0,0,1,1,2,2, 0,4, 1,3, 2,2 등..) 1차원배열로 검사합니다. 그리고 실수하기 쉬운것은 빙고의 개수를 확인하는 cnt변수를 전역변수가 아닌 빙고검사함수내의 지역변수로 선언해야한다는것입니다. 한번 검사하여 빙고가아니면 총 빙고의 갯수를 세는 변수는 초기화가되어야합니다.
코드
#include<iostream> using namespace std; int map[5][5]; void func(int call); bool bingo(); int main() { int call; for (int i = 0; i < 5; i++) for (int j = 0; j < 5; j++) cin >> map[i][j]; for (int i = 0; i < 25; i++) { cin >> call; //부르는 값을 0으로바꿈 func(call); //빙고확인//참이면 빙고완료 if (bingo()) { cout << i + 1 << endl; break; } } } void func(int call) { //부르는 값을 0으로초기화 for (int i = 0; i < 5; i++) for(int j=0;j<5;j++) if (call == map[i][j]) { map[i][j] = 0; return; } } bool bingo() { int cnt = 0; //행 빙고, 열빙고, 대각선 빙고 확인 for (int i = 0; i < 5; i++){ int sum = 0; for (int j = 0; j < 5; j++) { sum += map[i][j]; } if (sum == 0) cnt++; } //열빙고 for (int i = 0; i < 5; i++) { int sum = 0; for (int j = 0; j < 5; j++) { sum += map[j][i]; } if (sum == 0) cnt++; } //대각선빙고: 좌에서 우 int sum = 0; for (int i = 0; i < 5; i++) sum += map[i][i]; if (sum == 0)cnt++; //대각선빙고: 우에서 좌 sum = 0; for (int i = 0; i < 5; i++) sum += map[i][5 - 1 - i]; if (sum == 0)cnt++; if (cnt >= 3) return true; else return false; }
결과
'문제풀이(BOJ) > 시뮬레이션(구현)' 카테고리의 다른 글
[백준 9455] 박스 (0) | 2020.01.08 |
---|---|
[백준 12759] 틱!택!토! (0) | 2020.01.08 |
[백준 1526] 가장 큰 금민수 (0) | 2020.01.06 |
[백준 2303] 숫자 게임 (0) | 2020.01.03 |
[백준 10163] 색종이 (0) | 2020.01.03 |