오목 2615

PublicMinsu·2023년 9월 23일
0
post-custom-banner

문제

접근 방법

가장 왼쪽, 위에서부터 탐색해 주는 문제이다.
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개는 탐색으로 확인되니) 될 것으로 생각했는데 그렇게 되면 범위를 벗어나는 곳에서 가로, 세로 오목을 확인할 수 없다.

그리고 방향을 적어줄 때도 가장 왼쪽이 우선되게 방향을 작성해 줘야 한다. (만약 오른쪽 위 대각선이 아닌 왼쪽 밑 대각선으로 방향을 정했다면 오른쪽에서 왼쪽을 확인하는 것이기에 가장 왼쪽에 있는 값이 아니다)

profile
연락 : publicminsu@naver.com
post-custom-banner

0개의 댓글