본문 바로가기
알고리즘 풀이/백준

[백준 2615] 오목 (python)

by char_lie 2023. 3. 2.
반응형

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

 

2615번: 오목

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

www.acmicpc.net

오목 문제

오목 게임 룰에 따라 육목이 아니라 오목이 되는지 찾고, 그때 가장 왼쪽 위에 놓인 돌의 위치를 찾는 문제

접근을 처음부터 잘못해서, 오목은 가능하나 육목 조건을 제대로 찾지 못하였음

다른 사람의 힌트를 참고해서 해결 할 수 있었다.

정답코드

import sys
board = [list(map(int, sys.stdin.readline().split())) for _ in range(19)]
move= [[1,0],[1,1],[0,1],[-1,1]]
N = 19
result = 0

for i in range(N):
    for j in range(N):
        if board[i][j] != 0: # 돌이 있는 칸이면
            stone = board[i][j] # 돌의 색 저장
            for dy, dx in move: 
                ny, nx, cnt = i + dy, j + dx, 1
                while 0 <= ny < N and 0 <= nx < N and board[ny][nx] == stone: # 범위내에 있고, 해당 방향에 돌 색이 있다면
                    cnt += 1 # 1개씩 증가
                    if cnt == 5: # 오목이 됐으나 육목 체크
                        if 0 <= i - dy < N and 0 <= j - dx < N and board[i-dy][j-dx] == stone: # 반대칸에 하나 더 있거나
                            break
                        if 0 <= ny + dy < N and 0 <= nx + dx < N and board[ny+dy][nx+dx] == stone: # 앞에 한칸에 더 있으면
                            break
                        if stone == 1: # 흑돌
                            result = 1
                        if stone == 2: # 백돌
                            result = 2
                        y, x = i, j
                    ny += dy # 해당 방향으로 전진 해보자
                    nx += dx # 해당 방향으로 전진 해보자
if result > 0:
    print(result)
    print(y+1,x+1)
else:
    print(0)

문제 요구 사항은 제일 왼쪽 위에 있는 돌의 위치와, 승리한 돌의 색을 구하는 문제이다.

그렇기에 오목의 방향은 → ↓ ↗ ↘ 방향만 고려를 해주면되고 하나씩 탐색해 나가면 된다.

한 지점을 정해서 그 방향으로 계속해서 카운트해주고, 그때 만약 육목이 되는지를 체크해야 하고, 또 기준에 따라 육목이 오목으로 계산되버릴 수 있는 점을 생각해서 이전 방향까지 다 고려를 해줘야한다.

예를 들어 ●●●●●● 이런식으로 놓여있을 경우, 처음부터 계산해보면 육목이지만 두번째 칸에서 그대로 한쪽 방향만 고려하면 오목이 되어버린다. 이런 케이스를 고려해서 코드를 작성해야한다.

반응형

느낀 점

SWEA에 있는 오목문제를 풀고 똑같은 접근 방법으로 해도 되겠지 하고 시작했으나 이 문제는 육목까지도 고려해줘야하는 문제여서 까다로웠다. SWEA와 똑같이 하다보니 방향성을 잘못 잡았고, 그래서 완전히 내 힘으로 구현에는 실패했다. 중간에 해당하는 if문을 이용하여 이전 부분까지 찾는 방법을 참고해서 해결했다.

아직 구현 능력이 부족함을 많이 느꼈다..

반응형

댓글