본문 바로가기

알고리즘

[백준 2578] 빙고

www.acmicpc.net/problem/2578

 

2578번: 빙고

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

www.acmicpc.net

이문제는 처음에는 맵을 입력받고

하나씩 지워나가면서 우리가 늘 하던 익숙한 빙고게임과 똑같다

3 Bingo를 하면 게임에서 승리하며 그때까지 몇번에 도달하는지이다.

 

처음에 2차 for 문은 맵을 만드는 블록이고 

맵은 두가지로 5x5로 글로벌 변수로 선언한 애는 빙고의 유무를 알려주고

1차원으로 된 맵은 구조체를 통해 숫자에 맞춰 어디 위치에 있는지를 나타내는 변수이다.

 

이러한 1차원 맵은 실제로 빙고문제로 풀때 적극 활용되는데

받은 수에 맞춰 위치를 알려주고 2차원 맵에 빙고를 표시한다 

int Bingo(void) 함수는 빙고가 몇개인지 알려주는 함수이며 각줄마다 원소를 곱하여(글로벌 변수니 초기치는 0) 1이되면 빙고인 애들이

몇개인지 알려준다.

 

여기서 계산량을 줄이려고 생각한부분은

if(i > 10)인데 뭐 내생각에 3빙고가 되기 최소 수는 12정도는 되야할거같은데 내가 생각하지 못한 반례가 있을거같아

적어도 10개는 말한뒤 평가를 해야한다는 생각에 Bingo()함수를 최대한 적게 돌리는 방법으로 진행하였다.

(한번에 통과하니 기분이 좋네욤 ㅎㅎ)

 

 

코드는 다음과 같다.


#include <iostream>

#define MAP_SIZE 5

using namespace std;

typedef struct _cordi{
	int r;
	int c;
}Cordi;

int g_nMap[MAP_SIZE][MAP_SIZE];

int Bingo(void)
{
	int cnt = 0;

	cnt += g_nMap[0][0] * g_nMap[1][0] * g_nMap[2][0] * g_nMap[3][0] * g_nMap[4][0];
	cnt += g_nMap[0][1] * g_nMap[1][1] * g_nMap[2][1] * g_nMap[3][1] * g_nMap[4][1];
	cnt += g_nMap[0][2] * g_nMap[1][2] * g_nMap[2][2] * g_nMap[3][2] * g_nMap[4][2];
	cnt += g_nMap[0][3] * g_nMap[1][3] * g_nMap[2][3] * g_nMap[3][3] * g_nMap[4][3];
	cnt += g_nMap[0][4] * g_nMap[1][4] * g_nMap[2][4] * g_nMap[3][4] * g_nMap[4][4];

	cnt += g_nMap[0][0] * g_nMap[0][1] * g_nMap[0][2] * g_nMap[0][3] * g_nMap[0][4];
	cnt += g_nMap[1][0] * g_nMap[1][1] * g_nMap[1][2] * g_nMap[1][3] * g_nMap[1][4];
	cnt += g_nMap[2][0] * g_nMap[2][1] * g_nMap[2][2] * g_nMap[2][3] * g_nMap[2][4];
	cnt += g_nMap[3][0] * g_nMap[3][1] * g_nMap[3][2] * g_nMap[3][3] * g_nMap[3][4];
	cnt += g_nMap[4][0] * g_nMap[4][1] * g_nMap[4][2] * g_nMap[4][3] * g_nMap[4][4];

	cnt += g_nMap[0][0] * g_nMap[1][1] * g_nMap[2][2] * g_nMap[3][3] * g_nMap[4][4];
	cnt += g_nMap[0][4] * g_nMap[1][3] * g_nMap[2][2] * g_nMap[3][1] * g_nMap[4][0];

	return cnt;
}

int main(void)
{
	Cordi tMap[26];
	int nAns = 0;
	int nTmp = 0;

	for (int i = 0; i < MAP_SIZE; i++)
	{	
		for(int j = 0; j < MAP_SIZE; j++)
		{
			cin >> nTmp;
			tMap[nTmp].r = i;
			tMap[nTmp].c = j;
 		}	
	}

	for (int i = 0; i < 25; i++)
	{	
		if(i <= 10)
		{
			cin >> nTmp;
			g_nMap[tMap[nTmp].r][tMap[nTmp].c] = 1;
		}
		else
		{
			cin >> nTmp;
			g_nMap[tMap[nTmp].r][tMap[nTmp].c] = 1;
			
			if(Bingo() >= 3)
			{
				nAns = i+1;
				break;
			}
		}
	}

	cout << nAns << endl;

	return 0;
}

 

'알고리즘' 카테고리의 다른 글

[백준 1911] 흙길 보수하기  (0) 2020.10.14
[백준 17938] 퐁당퐁당2  (0) 2020.10.03
[백준 17838] 커맨드  (0) 2020.10.02
[백준 11048] 이동하기  (0) 2020.09.21
[백준 15903] 카드 합체 놀이  (0) 2020.09.21