본문 바로가기

알고리즘 문제/PS

BOJ 2578

코드 설명 

빙고 판에서 3번 이상 줄이 그어지는 경우 "빙고"이며, 숫자를 없앤 카운트 수를 반환한다.

 

총평

단순 배열 문제라고 생각하였지만, '선이 세 개 이상 그어지는 순간 "빙고"라고 외친다' 조건 때문에 생각을 조금 더 해야 한다.

#include <cstdio>
#include <iostream>
using namespace std;

int bingo[5][5];
int bin_total = 0;

int check_row(int y, int x)
{
	int bin = 1;
	for (int i = 0; i < 5; i++) {
		if (bingo[y][i] != -1) {
			bin = 0; break;
		}
	}
	return bin;
}
int check_col(int y, int x)
{
	int bin = 1;
	for (int i = 0; i < 5; i++) {
		if (bingo[i][x] != -1) {
			bin = 0; break;
		}
	}
	return bin;
}
int check_diag_down(int y, int x)
{
	int bin = 1;
	for (int i = 0; i < 5; i++) {
		if (bingo[i][i] != -1){
			bin = 0; break;
		}
	}
	return bin;
}

int check_diag_up(int y, int x)
{
	int bin = 1;
	for (int i = 0; i < 5; i++) {
		if (bingo[i][4 - i] != -1) {
			bin = 0; break;
		}
	}
	return bin;
}

int bingo_check(int num, int ord)
{
	int y, x;
	for (int i = 0; i < 5; i++)	{
		for (int j = 0; j < 5; j++)		{
			if (bingo[i][j] == num) {
				bingo[i][j] = -1;  y = i; x = j;
			}
		}
	}
	/*
	[False] 중간에 break해야 멈춘 지점의 (y,x)을 기준으로 검사할 수 있다.
		--> 이중 for문에서 한 for문만 빠져 나오므로 의미없다.
	[False] 2차 for문 밖에서 -1 한번더 검사한다.
		-> 기존에 -1되어 있는 것을 보고 빠져나온다
	[True]
		-> 어쩔수 없다. 중간 y,x 따로 변수 두어 저장한다.
	*/

	if (ord >= 5)
	{
		bin_total += check_row(y, x); //y
		bin_total += check_col(y, x); //x

		/*
		[Insight]
		세번 이상 그어지는 순간이므로, 검사 조건을 둘로 나누어야 한다. 
		따라서 중점( (2.2) 지점) 에 있다면, 두번 다 검사하게 한다. 

		또한, 줄을 긋는 경우는 누적 될 수 있어야 하므로 전역변수로 두는 게 맞다.
		*/
		if(y == x)
			bin_total += check_diag_down(y, x);
		if ((y + x) == 4)
			bin_total += check_diag_up(y, x);
	}
	return bin_total;
}

int main()
{
	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			cin >> bingo[i][j];
		}
	}
	int num;
	int cnt = 0;
	for(int i=1; i<=25; i++)
	{
		scanf("%d ", &num);
		bingo_check(num, i);
		cnt++;
		if (bin_total >= 3)
			break;
	}
	cout << cnt;
	return 0;
}

 

반응형

'알고리즘 문제 > PS' 카테고리의 다른 글

BOJ 9019(DSLR)  (0) 2021.10.21
KMP 알고리즘(문자열 비교)  (0) 2021.02.28
BOJ2546(경비원)  (0) 2021.01.09
BOJ 9205(맥주 마시면서 걸어가기)  (0) 2020.12.23
BOJ 3055  (0) 2020.08.08