[백준 2578] 빙고

Date:     Updated:

카테고리:

태그:

난이도

실버 V

📜문제

https://www.acmicpc.net/problem/2578

🌞풀이

#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개 이전에 빙고가 생길 수 있는데 그 빙고가 누락이 발생해서 틀렸었다.

맨 위로 이동하기

BOJ 카테고리 내 다른 글 보러가기

댓글남기기