[boj][c++] 17300 패턴

ppparkta·2022년 10월 7일
1

Problem solving

목록 보기
45/65

17300 패턴


맞?왜?틀??
반례를 못 찾겠어서 아쉽지만 다른 블로그의 풀이를 참고했다.
참고한 블로그의 풀이가 되게 잼당.

내풀이

#include	<iostream>
using namespace std;

int l;
int buffer[10];
bool swc;
int dx[8] = { 0,1,0,-1,1,1,-1,-1 };
int dy[8] = { 1,0,-1,0,1,-1,-1,1 };
bool visits[4][4];


bool check()
{
	for (int k = 0; k < l; k++)
	{
		int y = (buffer[k] - 1) / 3 + 1;
		int x = (buffer[k] - 1) % 3 + 1;
		//cout << "y & x : " << y <<" "<< x << endl;
		if (k == 0)
		{
			visits[y][x] = true;
			continue;
		}
		if (visits[y][x] == true)
		{
			//cout << "already use" << endl;
			return false;
		}
		visits[y][x] = true;
		swc = false;
		for (int i = 0; i < 8; i++)
		{
			int ny = y + dy[i];
			int nx = x + dx[i];
			//cout << "ny & nx : " << ny << " " << nx << endl;
			if ((ny < 1 || ny > 3) || (nx < 1 || nx > 3))
				continue;
			if (visits[ny][nx] == true)
				swc = true;
		}
		if (swc == false)
		{
			//cout << "do not use prev" << endl;
			return false;
		}
	}
	return true;
}

int main()
{
	cin >> l;
	for(int i = 0; i < l; i++)
	{
		cin >> buffer[i];
	}
	if (!check() || l < 3)
		cout << "NO" << '\n';
	else
		cout << "YES" << '\n';
}

블로그 참고 풀이

#include	<iostream>
using namespace std;

int l;
bool visits[10];

void no()
{
	cout << "NO" << endl;
	exit(0);
}

int main()
{
	cin >> l;
	int prev = 0, cur = 0;
	while (l--)
	{
		prev = cur;
		cin >> cur;
		if (visits[cur] == true)
			no();
		visits[cur] = true;
		if (prev == 0)
			continue;
		if (visits[2] == false)
			if (cur + prev == 4)
				no();
		if (visits[4] == false)
			if ((cur == 1 && prev == 7) || (cur == 7 && prev == 1))
				no();
		if (visits[5] == false)
			if (cur + prev == 10)
				no();
		if(visits[6]==false)
			if((cur == 3 && prev == 9)||(cur == 9 && prev == 3))
				no();
		if (visits[8] == false)
			if ((cur == 7 && prev == 9) || (cur == 9 && prev == 7))
				no();
	}
	cout << "YES" << endl;
	return 0;
}
profile
겉촉속촉

0개의 댓글