본문 바로가기

컴퓨터/코테

블록이동하기(드론 조종) - bfs

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