-
Notifications
You must be signed in to change notification settings - Fork 5
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
24-jung0115 #187
Open
jung0115
wants to merge
25
commits into
main
Choose a base branch
from
24-jung0115
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
24-jung0115 #187
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
janghw0126
approved these changes
Nov 11, 2024
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
와우 프림알고리즘 제대로 까먹고 있었는데 정미님 덕분에 다시 상기되었습니다!
덕분에 개념부터 활용까지 확실히 알 수 있었네요🥹
저도 정미님의 코드를 따라가보면서 프림 알고리즘의 초점에 맞춰 하나의 정점을 정하고 인접 정점 중 가중치가 낮은 간선을 계속 골라가는 방법으로 구현하였습니다.
def solution(n, costs):
answer = 0
# 그래프를 초기화함
graph = [[] for _ in range(n)]
for u, v, cost in costs:
graph[u].append((cost, v))
graph[v].append((cost, u))
# 연결된 섬 집합과 초기 다리 후보 리스트를 선언함
connected_islands = set([0])
bridge_candidates = graph[0]
# 비용 오름차순으로 정렬
bridge_candidates.sort()
while len(connected_islands) < n:
cost, next_island = bridge_candidates.pop(0)
# 이미 연결된 섬일 경우 스킵함
if next_island in connected_islands:
continue
# 다리를 건설하고 섬을 연결함
answer += cost
connected_islands.add(next_island)
# 새로 연결된 섬의 다리 후보를 추가함
for new_bridge in graph[next_island]:
if new_bridge[1] not in connected_islands:
bridge_candidates.append(new_bridge)
# 항상 최소 비용의 다리부터 선택할 수 있도록 정렬함
bridge_candidates.sort()
return answer
다른 분들의 코드를 보니까 하나의 정점을 정하는 것이 아닌 임의의 정점에서 시작하여 선택해나가는 크루스칼 알고리즘을 이용한 풀이도 있었습니다!
참고하시면 좋을 것 같아요😚👍
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
➡️ 풀이 코드
🔗 문제 링크
프로그래머스 | 그리디 알고리즘 - 섬 연결하기(Lv.3)
✔️ 소요된 시간
45분
✨ 수도 코드
Prim 알고리즘을 활용해서 그리디하게 풀어냈습니다!
우선 costs 배열의 내용을 보고, 건설 가능한 다리를 그래프로 저장해줬습니다. 그래프에는 각 섬마다 연결된 섬과 비용이 저장됩니다
그리고 0번 섬부터 시작해서 아래의 과정을 따릅니다
connect
set은 연결이 완료된 섬을 관리. connect에 0 추가edges
리스트에 0번 섬과 연결된 모든 간선을 추가하고, 비용 순서대로 정렬edges
리스트에서 가장 비용이 적은 간선 선택3-1. 선택한 간선의 도착지가 이미 connect에 있을 경우, 이미 연결된 섬이므로 패스
3-2. 그렇지 않을 경우 해당 간선을 연결하고, 1번 과정으로 돌아가서 도착점에 있는 섬에서 연결된 최적 간선 찾기
모든 섬이 연결되면 위 과정을 종료하고, 누적된 총 비용을 반환하면 됩니다!
최종 코드
📚 새롭게 알게된 내용