알 수 없는 사용자 2022. 2. 25. 00:47

문제

https://www.acmicpc.net/problem/2615

 

2615번: 오목

오목은 바둑판에 검은 바둑알과 흰 바둑알을 교대로 놓아서 겨루는 게임이다. 바둑판에는 19개의 가로줄과 19개의 세로줄이 그려져 있는데 가로줄은 위에서부터 아래로 1번, 2번, ... ,19번의 번호

www.acmicpc.net

풀이

구현 + 브루트포스 알고리즘 문제이다. 문제 조건을 꼼꼼히 읽지 않아서 많이 틀렸는데 오답률이 낮은 이유가 있다.. 

북동, 동, 남동, 남 방향으로 확인하면 되는데 범위를 넘어가는 경우나 6개이상 놓여 있으면 안되는 조건을 꼭 숙지해야한다

 

코드

#include <bits/stdc++.h>
using namespace std;

int board[20][20];

// 범위 안에 있는지 확인하는 함수
bool inside(int x, int y) {
    return (1 <= x && x <= 19) && (1 <= y && y <= 19);
}

// 행 방향으로 check
bool row_check(int x, int y) {
    if (inside(x, y - 1) && board[x][y] == board[x][y - 1]) return false;
    for (int i = 1; i < 5; i++) {
        if (!inside(x, y + i) || board[x][y + i] != board[x][y]) return false;
    }
    if (inside(x, y + 5) && board[x][y] == board[x][y + 5]) return false;
    return true;
}

// 열 방향으로 check
bool colum_check(int x, int y) {
    if (inside(x - 1, y) && board[x][y] == board[x - 1][y]) return false;
    for (int i = 1; i < 5; i++) {
        if (!inside(x + i, y) || board[x + i][y] != board[x][y]) return false;
    }
    if (inside(x + 5, y) && board[x][y] == board[x + 5][y]) return false;
    return true;
}

// 아래로 향하는 대각선으로 check
bool cross_check1(int x, int y) {
    if (inside(x - 1, y - 1)  && board[x][y] == board[x - 1][y - 1]) return false;
    for (int i = 1; i < 5; i++) {
        if (!inside(x + i, y + i) || board[x + i][y + i] != board[x][y]) return false;
    }
    if (inside(x + 5, y + 5) && board[x][y] == board[x + 5][y + 5]) return false;
    return true;
}

// 위로 향하는 대각선으로 check
bool cross_check2(int x, int y) {
    if (inside(x + 1, y - 1)  && board[x][y] == board[x + 1][y - 1]) return false;
    for (int i = 1; i < 5; i++) {
        if (!inside(x - i, y + i) || board[x - i][y + i] != board[x][y]) return false;
    }
    if (inside(x - 5, y + 5) && board[x][y] == board[x - 5][y + 5]) return false;
    return true;
}

int main(void) {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    for (int i = 1; i <= 19; i++) {
        for (int j = 1; j <= 19; j++) {
            cin >> board[i][j];
        }
    }
    for (int i = 1; i <= 19; i++) {
        for (int j = 1; j <= 19; j++) {
            if (board[i][j] != 0) {
                if (row_check(i, j) || colum_check(i, j) || cross_check1(i, j) || cross_check2(i, j)) {
                    cout << board[i][j] << '\n' << i << " " << j;
                    return 0;
                }
            }
        }
    }
    // 승부가 안나면 0출력
    cout << 0;
}