Coding Test/Baekjoon

[백준] 2578번 - 빙고 / C++

peachh 2021. 4. 13. 17:34
728x90

문제

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

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

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

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

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

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

 

입력

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

 

출력

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

 

코드

#include <iostream>
#include <queue>

#define	HORIZONTAL	0
#define	VERTICAL	1
#define DIAGONAL	2

using namespace std;

struct pos
{
	int r;
	int c;
};

pos num[26];	// 숫자가 적힌 위치
int cnt[3][5];	// 0: 가로선, 1: 세로선, 2: 대각선

int main()
{
	int i, j, n;
	int turn = 0;
	int line = 0;
	queue<int> q;

	// 각 숫자가 적힌 위치를 저장
	for (i = 0; i < 5; i++)
	{
		for (j = 0; j < 5; j++)
		{
			cin >> n;
			num[n].r = i;
			num[n].c = j;
		}
	}
	// 사회자가 부르는 수를 큐에 저장
	for (i = 0; i < 25; i++)
	{
		cin >> n;
		q.push(n);
	}
	// 빙고를 외치기 전까지 숫자를 순서대로 지우고 선을 그음
	while (!q.empty() && line < 3)
	{
		turn++;
		n = q.front();
		q.pop();

		// 가로선에서 삭제
		cnt[HORIZONTAL][num[n].r]++;
		if (cnt[HORIZONTAL][num[n].r] == 5)
			line++;
		
		// 세로선에서 삭제
		cnt[VERTICAL][num[n].c]++;
		if (cnt[VERTICAL][num[n].c] == 5)
			line++;
		
		// 대각선에서 삭제 (\)
		if (num[n].r == num[n].c)
		{
			cnt[DIAGONAL][0]++;
			if (cnt[DIAGONAL][0] == 5)
				line++;
		}

		// 대각선에서 삭제 (/)
		if (num[n].r + num[n].c == 4)
		{
			cnt[DIAGONAL][1]++;
			if (cnt[DIAGONAL][1] == 5)
				line++;
		}
	}
	cout << turn << endl;
	return 0;
}

 

빙고판을 저장하는 대신 각각의 숫자들이 빙고판의 어떤 위치에 적혀있는지를 저장한다. 이후 숫자를 부를 때마다 해당 숫자가 속한 가로, 세로, 대각선에서 숫자를 지운다. cnt 배열에는 각 라인에서 지워진 숫자의 개수를 저장하고, 이 값이 5가 되면 해당 라인의 모든 숫자가 지워진 것이므로 선을 긋는다. 

 

링크

 

2578번: 빙고

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

www.acmicpc.net

 

inbdni/Baekjoon

Contribute to inbdni/Baekjoon development by creating an account on GitHub.

github.com

 

728x90