[2020ココ実習]慶州建設


  • 回答時間:42分
  • 題出所:https://programmers.co.kr/learn/courses/30/lessons/672592

  • 問題情報

  • 0が空/1が満
  • 出発点:(0,0)/到着点(N-1,N-1)
  • の壁があるところは建てられません.
  • 滑走路起点は(0,0)格、終点は(N-1,N-1)格
  • 到達点接続可能(N−1,N−1)格子を建設する.

  • 入力

  • のグラフィック状態(0は空、1は壁)を示す2 Dフラットパネル
  • .

  • しゅつりょく

  • レーンの構築に必要な最低コストリターン

  • コード#コード#


  • from collections import deque
    def solution(matrix):
    
        N, M = len(matrix), len(matrix)
        dx = [0, -1, 0, 1]  # 상 좌 하 우
        dy = [-1, 0, 1, 0]
    
        def iswall(nx, ny):
            if nx < 0 or ny < 0:
                return False
            if nx >= N or ny >= M:
                return False
            if matrix[nx][ny] == 1:
                return False
            return True
    
        def bfs(start):
            queue = deque([start])
            matrix[0][0]= 1
            min_money = [[100000000] * N for _ in range(M)]
            min_money[0][0] = 0
    
            while queue:
                x,y,cost,head = queue.popleft() # 좌표
                for i in range(4): # 상 하 좌 우 좌표 살피기
                    nx, ny=x+dx[i], y+dy[i]
                    if iswall(nx,ny) :
                        if head != i: # 곡선 도로(모서리 + 직선)
                            n_cost = cost+ 600
                        else : # 직선 도로(직선)
                            n_cost = cost + 100
                        if n_cost < min_money[nx][ny]: # 최솟값인 경우
                            min_money[nx][ny] = n_cost
                            queue.append([nx, ny, n_cost, i])
            return min_money[-1][-1]
        return min(bfs((0,0,0,2)),bfs((0,0,0,3))) # 시작은 우, 하
    
    matrix = [[0,0,0],[0,0,0],[0,0,0]]
    print(solution(matrix))