이문제는 처음에는 맵을 입력받고
하나씩 지워나가면서 우리가 늘 하던 익숙한 빙고게임과 똑같다
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 |