맞?왜?틀??
반례를 못 찾겠어서 아쉽지만 다른 블로그의 풀이를 참고했다.
참고한 블로그의 풀이가 되게 잼당.
내풀이
#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;
}