문제출처: 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

+ Recent posts