[백준 2578] 빙고
카테고리: BOJ
태그: Cpp Silver V 구현 Coding Test
난이도
실버 V
📜문제
🌞풀이
#include <iostream>
using namespace std;
int bingo[5][5];
bool check[5][5];
int bingo_cnt;
void Bingo_Check(int k, int j)
{
int cnt = 0;
//가로
for (int i = 0; i < 5; i++)
{
if (check[k][i] == true) cnt++;
else break;
}
if (cnt == 5) bingo_cnt++;
//세로
cnt = 0;
for (int i = 0; i < 5; i++)
{
if (check[i][j] == true) cnt++;
else break;
}
if (cnt == 5) bingo_cnt++;
//대각선 좌 -> 우
cnt = 0;
if (k == j)
{
for (int i = 0; i < 5; i++)
{
if (check[i][i] == true) cnt++;
else break;
}
if (cnt == 5) bingo_cnt++;
}
//대각선 우 -> 좌
cnt = 0;
if (k + j == 4)
{
for (int i = 0; i < 5; i++)
{
if (check[i][4-i] == true) cnt++;
else break;
}
if (cnt == 5) bingo_cnt++;
}
}
int main()
{
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
cin >> bingo[i][j]; //빙고판 생성
}
}
int value = 0;
for (int i = 0; i < 25; i++)// 25개 입력받음
{
cin >> value;
for (int k = 0; k < 5; k++)
{
for (int j = 0; j < 5; j++)
{
if (bingo[k][j] == value)
{
check[k][j] = true;
Bingo_Check(k, j);
if (bingo_cnt >= 3) //동시에 2개가 늘어나서 4개가 될수도 있어서 >= 붙임
{
cout << i+1 << "\n";
return 0;
}
else // bingo_cnt가 3이 아니라면 새로운 수를 입력받아야하므로 탈출조건을 준다
{
k = 5;
j = 5;
}
}
}
}
}
return 0;
}
- 처음에 bingo배열에 수를 입력받아 빙고판을 만든다
- 수를 하나씩 지워 나가는데 수를 입력받았을때 빙고가 될 수 있는 경우는 가로, 세로, 대각선이다.
- 입력받을 때 마다 빙고가 되는지를 확인해 bingo_cnt를 늘려준다.
❗주의
-
빙고가 3개가 되기 위해선 최소 12개를 채워야 가능하다.
-
그렇기 때문에 i >= 12 부터 Bingo_check를 했었는데 이게 성립하기 위해선 하나의 값을 입력받을 때마다 빙고판 전체를 탐색해서 한번에 빙고개수를 파악할때 가능한것이다.
-
나의 풀이대로 하면 12개 이전에 빙고가 생길 수 있는데 그 빙고가 누락이 발생해서 틀렸었다.
댓글남기기