def solution(board):
H = len(board)
W = len(board[0])
moves = [
[0, 1],
[0, -1],
[1, 0],
[-1, 0]
]
def bfs():
state = [[[True, True] for _ in range(W)] for __ in range(H)]
# 0 가로, 1 세로
q = [[0, 0, 0, 0]]
state[0][0][0] = False
while q:
y, x, curDir, cnt = q.pop(0)
if curDir:
# 탈출 조건 체크
if x == W - 1 and y + 1 == H - 1:
return cnt
# 현재 세로라면 이동 or 회전 4가지
# 이동한다면
for move in moves:
# 갈 수 있는지 이제부터 확인. 세로형태이므로
upy = y + move[0]
downy = upy + 1
nx = x + move[1]
if 0 <= nx < W and 0 <= upy and downy < H and board[upy][nx] == 0 and board[downy][nx] == 0 and state[upy][nx][1]:
state[upy][nx][1] = False
q.append([upy, nx, 1, cnt + 1])
# 왼쪽 회전 가능하나?
if x > 0 and board[y][x - 1] == 0 and board[y + 1][x - 1] == 0:
if state[y][x - 1][0]:
state[y][x - 1][0] = False
q.append([y, x - 1, 0, cnt + 1])
if state[y + 1][x - 1][0]:
state[y + 1][x - 1][0] = False
q.append([y + 1, x - 1, 0, cnt + 1])
# 오른쪽 회전 가능하나?
if x < W - 1 and board[y][x + 1] == 0 and board[y + 1][x + 1] == 0:
if state[y][x][0]:
state[y][x][0] = False
q.append([y, x, 0, cnt + 1])
if state[y + 1][x][0]:
state[y + 1][x][0] = False
q.append([y + 1, x, 0, cnt + 1])
else:
# 탈출 조건 체크
if y == H - 1 and x + 1 == W - 1:
return cnt
# 현재 가로라면 이동
for move in moves:
ny = y + move[0]
leftx = x + move[1]
rightx = leftx + 1
if 0 <= ny < H and 0 <= leftx and rightx < W and board[ny][leftx] == 0 and board[ny][rightx] == 0 and state[ny][leftx][0]:
state[ny][leftx][0] = False
q.append([ny, leftx, 0, cnt + 1])
# 위로 회전 되나?
if y > 0 and board[y-1][x] == 0 and board[y-1][x+1] == 0:
if state[y-1][x][1] :
state[y - 1][x][1] = False
q.append([y-1, x, 1, cnt + 1])
if state[y-1][x+1][1]:
state[y - 1][x + 1][1] = False
q.append([y-1, x+1, 1, cnt + 1])
if y < H - 1 and board[y+1][x] == 0 and board[y+1][x+1] == 0:
if state[y][x][1]:
state[y][x][1] = False
q.append([y, x, 1, cnt + 1])
if state[y][x+1][1]:
state[y][x + 1][1] = False
q.append([y, x+1, 1, cnt + 1])
return bfs()
if문 하나 잘못 설정해놔서 한참 헤맨 문제..
역시 bfs는 집중력 잃는 순간 끝이다. 그리고 빠른 해결 포인트는 로그 찍어서 해결하는 것. 디버깅보다 훨씬 빠르다
'컴퓨터 > 코테' 카테고리의 다른 글
삼성 기출 9660 번호 붙이기 (0) | 2021.09.13 |
---|---|
백준 1987 알파벳 - bfs (0) | 2021.09.12 |
카카오 외벽 점검 (0) | 2021.09.10 |
백준 2533 SNS (0) | 2021.09.10 |
카카오 매출하락 최소화 - 트리 dp (0) | 2021.09.10 |