출처 :https://school.programmers.co.kr/learn/courses/30/lessons/42861?language=python3
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제
문제 해설
연결된 섬의 번호와 이동에 필요한 비용 list가 주어진다. 모든 섬을 지날 수 있는 최소비용을 반환하면 된다.
문제 풀이
해당 문제는 전체 노드를 방문할 수 있는 최소비용을 반환하는 문제로, 플로이드 와샬 알고리즘을 이용해서 풀었다.
먼저, 필요한 자원은
1. checked : 방문여부 체크
2. values : 해당 노드와 연결된 노드로부터, 해당 노드로 갈 수 있는 최소 비용 리스트. default = 99999로 최댓값으로 저장해놓는다.
3. graph : 문제에서 입력 받은 연결 노드 정보와 비용을 담을 dictionary
* 모든 노드를 방문할 때까지 아래 로직을 반복한다.
(1) 현재 노드(시작=0번 index)와 연결된 노드를 방문한 적이 없다면, 해당 노드 방문에 필요한 비용을 min(현재 저장된 비용, 현재노드 -> 연결노드 비용) 으로 갱신한다.
(2) 현재 방문하지 않은 노드 중, 최소 비용을 가진 노드를 탐색한 뒤, 최소비용을 answer에 더해준다.
- 방문하지 않은 노드 중, 최소 비용의 노드는 반드시 방문해야 하는 노드이다.
(1)에서 현재 노드를 기준으로 최솟값으로 갱신해주었으니, 최소비용이 될 후보값들은 모두 이전에 방문한 노드들과 연결될 수 있는 노드들이다. 이 중에서 방문하지 않고 그 중에 최소비용을 가진 노드라면, 이번 타임에 필히 방문해야 하는 노드인 것이다.
(3) 해당 노드를 start로 갱신하고, 방문처리한다.
* 반복이 끝나면 answer을 반환한다.
* 코드
def solution(n, costs):
checked = [False for _ in range(n)]
values = [99999 for _ in range(n)]
start = 0
checked[start] = True
values[start] = 0
answer = 0
graph = {}
for i in range(len(costs)):
new_key = costs[i][0]
new_value = costs[i][1]
updated_value = graph.get(new_key) or {}
updated_value[new_value] = costs[i][2]
graph[new_key] = updated_value
updated_value = graph.get(new_value) or {}
updated_value[new_key] = costs[i][2]
graph[new_value] = updated_value
while False in checked:
# 비용 최소값 갱신
for i in graph[start]:
if checked[i] == False:
values[i] = min(values[i], graph[start][i])
refer = 99999
new_index = -1
# 방문하지 않는 노드 중, 최소비용 노드 탐색
for i in range(n):
if checked[i] == False and values[i] != 0:
if values[i] < refer:
refer = values[i]
new_index = i
# 위에서 찾은 노드 방문처리 및 start 갱신
answer = answer + refer
checked[new_index] = True
start = new_index
return answer
'💡코딩테스트 > HARD' 카테고리의 다른 글
[Programmers]입국심사_Python (0) | 2022.09.12 |
---|---|
[BAEKJOON] 2886_자리 전쟁_Python (0) | 2022.09.05 |
[Programmers]기지국 설치_Python (0) | 2022.08.08 |
[Programmers]가장 먼 노드_Java (0) | 2022.08.02 |
[Programmers] 배달_Java (0) | 2022.08.01 |