Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 백준
- Spring
- 플로이드 와샬
- 2020 KAKAO BLIND RECRUITMENT
- 비트마스킹
- 2020 카카오 인턴십
- 크루스칼
- 백트래킹
- 구현
- 브루트포스
- 조합
- BFS
- GIT
- 파이썬
- 우선순위큐
- 투 포인터
- 2021 KAKAO BLIND RECRUITMENT
- 시뮬레이션
- 2019 KAKAO BLIND RECRUITMENT
- 2018 KAKAO BLIND RECRUITMENT
- 이분탐색
- 최소 신장 트리
- 다익스트라
- 로봇 청소기
- 트라이
- 플로이드와샬
- 프로그래머스
- 스택
- SWEA
- 투포인터
Archives
- Today
- Total
개발조아
[프로그래머스] 경주로 건설 파이썬 본문
728x90
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/67259
최소 비용으로 목적지에 도달해야하므로 다익스트라로 해결했다.
같은 방향으로 간다면 비용은 +100
다른 방향으로 간다면 +600을 해줬다.
같던 칸으로 돌아가는 경우는 어차피 비용이 더 큰값으로 해당 칸을 접근하는 것이니 고려할 필요가 없다.
또한 방향이 달라지면 비용이 달라지므로 해당 칸으로 들어오는 방향을 구분해줘야한다.
파란 원칸(1,1)칸을 봐보자.
우선순위큐에 어떤순서로 넣느냐에 따라 (1,2)의 칸에 도달하는 최소 비용이 달라진다.
(1,1)로 갈수 있는 칸은 (0,1)과 (1,0) 두곳이다. 두곳 모두 (1,1)에 도달했을 때 비용은 700이다.
하지만 (1,2)의 칸은 (0,1)이 먼저 왔다면 1300이고 (1,0)이 먼저 왔다면 800이다.
그래서 (0,1)이 먼저 방문되어지면 답을 도출하지 못한다.
따라서 들어온 방향에 따라 구분해줘야한다.
그래서 cost 배열을 3차원으로 하고, x,y,방향으로 인덱스를 지정했다.
3차원 cost배열로 다익스트라를 수행하면 된다.
from heapq import heappush, heappop
INF = 9876543210
dx = [-1,1,0,0]
dy = [0,0,-1,1]
def solution(board):
return dijkstra(board)
def dijkstra(board):
n = len(board)
pq = [(0,0,0,-1)]
cost = [[[INF]*4 for _ in range(n)] for _ in range(n)]
cost[0][0] = [0,0,0,0]
while pq:
c,x,y,dir = heappop(pq)
if dir != -1 and cost[x][y][dir] != c:
continue
if (x,y) == (n-1,n-1):
return c
for d in range(4):
nx = x + dx[d]
ny = y + dy[d]
if point_validator(nx,ny,n,board):
if dir == -1 or dir == d:
if cost[nx][ny][d] > c + 100:
cost[nx][ny][d] = c+100
heappush(pq,(c+100,nx,ny,d))
else:
if cost[nx][ny][d] > c + 600:
cost[nx][ny][d] = c+600
heappush(pq,(c+600,nx,ny,d))
def point_validator(x,y,n,board):
if x < 0 or y < 0 or x >= n or y >= n:
return False
elif board[x][y] == 1:
return False
return True
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 매칭 점수 파이썬 (0) | 2021.12.01 |
---|---|
[프로그래머스] 자동완성 파이썬 (0) | 2021.11.29 |
[프로그래머스] 보석 쇼핑 파이썬 (0) | 2021.11.26 |
[프로그래머스] 아이템 줍기 파이썬 (0) | 2021.10.23 |
[프로그래머스] 셔틀버스 파이썬 (0) | 2021.10.06 |
Comments