가장 왼쪽, 위에서부터 탐색해 주는 문제이다.
19*19이기에 시간 초과는 문제가 안 된다.
대신 문제에서 원하는 동작을 제대로 구현해 줘야 한다.
가장 왼쪽에 있는 바둑알부터 원한다는 점에서 5개가 맞는지 확인할 때 방향을 잘 선택해 줘야 한다.
#include <iostream>
using namespace std;
int map[19][19], dy[] = {-1, 0, 1, 1}, dx[] = {1, 1, 1, 0};
bool isWin(int y, int x, int dir)
{
for (int i = 1; i < 5; ++i)
{
int ny = y + dy[dir] * i;
int nx = x + dx[dir] * i;
if (ny >= 19 || nx >= 19 || ny < 0)
return false;
if (map[ny][nx] != map[y][x])
return false;
}
int ny = y + dy[dir] * 5;
int nx = x + dx[dir] * 5;
if (ny >= 0 && ny < 19 && nx < 19 && map[ny][nx] == map[y][x])
return false;
ny = y + dy[dir] * -1;
nx = x + dx[dir] * -1;
if (ny >= 0 && ny < 19 && nx < 19 && map[ny][nx] == map[y][x])
return false;
return true;
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0);
for (int i = 0; i < 19; ++i)
for (int j = 0; j < 19; ++j)
cin >> map[i][j];
for (int i = 0; i < 19; ++i)
for (int j = 0; j < 19; ++j)
if (map[i][j])
for (int k = 0; k < 4; ++k)
if (isWin(i, j, k))
{
cout << map[i][j] << "\n"
<< i + 1 << " " << j + 1;
return 0;
}
cout << 0;
return 0;
}
쉽게 보고 굉장히 실수를 많이 한 문제다.
쉬운 문제는 맞으나 고려해 줘야 할 게 있다.
당연히 왼쪽 위로 갈수록 값은 작아진다. 헷갈려서 양수로 생각해 틀렸다.
또한 탐색할 때 15x15의 범위만 확인하면 (어차피 나머지 4개는 탐색으로 확인되니) 될 것으로 생각했는데 그렇게 되면 범위를 벗어나는 곳에서 가로, 세로 오목을 확인할 수 없다.
그리고 방향을 적어줄 때도 가장 왼쪽이 우선되게 방향을 작성해 줘야 한다. (만약 오른쪽 위 대각선이 아닌 왼쪽 밑 대각선으로 방향을 정했다면 오른쪽에서 왼쪽을 확인하는 것이기에 가장 왼쪽에 있는 값이 아니다)