본문 바로가기
🔅코딩테스트 공부🔅/❗백준

[백준] 2615번 오목(python)

by 윤무무 2023. 4. 25.

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

 

2615번: 오목

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

www.acmicpc.net

 

1. 난이도 실버1

 

2. 내가 작성한 코드
maps = [list(map(int, input().split())) for _ in range(19)]

total_arrow = {"down":(1,0),"right":(0,1),'down_right':(1,1),'down_left':(1,-1)}

visit_down = [[0] * 19 for _ in range(19)]
visit_right = [[0] * 19 for _ in range(19)]
visit_downleft = [[0] * 19 for _ in range(19)]
visit_downright = [[0] * 19 for _ in range(19)]


def repeat(visit,x,y,arrow, color, cnt):
    nx = x + total_arrow[arrow][0]
    ny = y + total_arrow[arrow][1]

    if nx<=18 and ny<=18 and nx>=0 and ny>=0:
        if visit[nx][ny] == 0:
            visit[nx][ny] = 1
            if maps[nx][ny] == color:
                cnt+=1
                return repeat(visit,nx,ny,arrow,color,cnt)
            else:
                return cnt
        else:
            return cnt
    else:
        return cnt

for i in range(19):
    for j in range(19):
        if maps[i][j] != 0:
            down = repeat(visit_down,i,j,"down",maps[i][j],1)
            right = repeat(visit_right,i,j,"right",maps[i][j],1)
            down_left = repeat(visit_downleft,i,j,"down_left",maps[i][j],1)
            down_right = repeat(visit_downright,i,j,"down_right",maps[i][j],1)
            if 5 in [down,right,down_right]:
                print(maps[i][j])
                print(i+1,j+1)
                exit()
            if 5 == down_left:
                print(maps[i][j])
                print(i+5, j-3)
                exit()

print(0)

 

나는 대각선을 검사할 때 ↘, ↙ 방향으로 검사를 했더니 오류가 났다

 

맞 왜 틀? 이라고 생각하며 문제를 차근차근 보며 깨달은 것은

 

제일 왼쪽에 바둑알의 행과 열을 순서로 출력해야 하는데, ↙ 으로 하는 경우 I,J 이 맨 왼쪽에 있는 바둑알이 아닌 것이었다!

 

따라서 아래, 오른쪽, ↗,  ↘ 방향으로 검사하는 게 더 편하다.

 

 

 

문제 자체를 재귀 + 방향 별 다른 배열을 만들어서 cnt를 체크했는데

 

그냥 BFS를 돌리면 되는 문제였다. 

 

아래처럼 푸는게 베스트인듯!

 

 

https://velog.io/@hygge/Python-%EB%B0%B1%EC%A4%80-2615-%EC%98%A4%EB%AA%A9-Brute-Force

 

[Python] 백준 2615 오목 (Brute Force)

(0, 0)부터 (18, 18)까지 모든 좌표에서 방향 갯수만큼 for문을 4번 돌려 → ↓ ↘ ↗ 방향으로 쭉쭉 5칸씩을 체크! (바둑돌이 놓여있는 경우에만=즉 좌표에 저장된 값이 0이 아닌 경우에만) x, y는 현재

velog.io

 

 

댓글