알고리즘/programmers

[ programmers ] 경주로 건설 67259번 ( python )

Yanoo 2021. 8. 17. 18:14
728x90
반응형

문제

프로그래머스 67259 경주로 건설 풀이 ( 파이썬 )

https://programmers.co.kr/learn/courses/30/lessons/67259

 

코딩테스트 연습 - 경주로 건설

[[0,0,0,0,0,0,0,1],[0,0,0,0,0,0,0,0],[0,0,0,0,0,1,0,0],[0,0,0,0,1,0,0,0],[0,0,0,1,0,0,0,1],[0,0,1,0,0,0,1,0],[0,1,0,0,0,1,0,0],[1,0,0,0,0,0,0,0]] 3800 [[0,0,1,0],[0,0,0,0],[0,1,0,1],[1,0,0,0]] 2100 [[0,0,0,0,0,0],[0,1,1,1,1,0],[0,0,1,0,0,0],[1,0,0,1,0,1],[

programmers.co.kr

 

풀이

co_board라는 최대값들을 가진 같은 크기의 2차원 리스트를 만들고 cost를 더한 값이 다음으로 진행하는 칸의 값보다 작다면 진행하는 칸의 크기를 갱신해 준다.

if c_dire + 2 == i or c_dire - 2 == i:
	continue

이 부분은 for문을 돌려서 방향을 탐색하는 중의 반대 방향은 탐색하지 않아도 되기 때문에 넣었다.

from collections import deque

def solution(board):
    answer = int(1e9)

    MAX_VALUE = int(1e6)

    dx = [-1, 0, 1, 0]
    dy = [0, 1, 0, -1]
    size = len(board)
    co_board = [[MAX_VALUE] * size for _ in range(size)]

    q = deque()
    
    q.append((0,0,1,0))
    q.append((0,0,2,0))

    while q:
        cx, cy, c_dire, c_cost = q.popleft()
        
        if cx == size - 1 and cy == size -1:
            answer = min(answer, c_cost)
            continue

        for i in range(4):
            nx = cx + dx[i]
            ny = cy + dy[i]
            cost = 0
            if nx < 0 or ny < 0 or nx >= size or ny >= size or board[nx][ny] == 1:
                continue
            if c_dire + 2 == i or c_dire - 2 == i:
                continue
            if c_dire == i:
                cost = 100
            else:
                cost = 500 + 100
            if co_board[nx][ny] >= c_cost + cost:
                co_board[nx][ny] = c_cost + cost
                q.append((nx, ny, i, c_cost + cost))
            
    print(answer)
    # for i in co_board:
    #     print(i)
    return answer
728x90
반응형