πŸ’»μ½”λ”©ν…ŒμŠ€νŠΈ λ¬Έμ œν’€μ΄21

μ§€λ―Όμ„œΒ·2023λ…„ 3μ›” 16일
0

coding test

λͺ©λ‘ 보기
20/30

Chapter11. 자주 λ“±μž₯ν•˜λŠ” 자료 ꡬ쑰

[문제50] 섬 μ—°κ²°ν•˜κΈ° - Level3

n개의 섬 사이에 닀리λ₯Ό κ±΄μ„€ν•˜λŠ” λΉ„μš©(costs)이 μ£Όμ–΄μ§ˆ λ•Œ, μ΅œμ†Œμ˜ λΉ„μš©μœΌλ‘œ λͺ¨λ“  섬이 μ„œλ‘œ 톡행 κ°€λŠ₯ν•˜λ„λ‘ λ§Œλ“€ λ•Œ ν•„μš”ν•œ μ΅œμ†Œ λΉ„μš©μ„ returnν•˜λ„λ‘ solution을 μ™„μ„±ν•˜μ„Έμš”.

닀리λ₯Ό μ—¬λŸ¬ 번 κ±΄λ„ˆλ”λΌλ„, 도달할 수만 있으면 톡행 κ°€λŠ₯ν•˜λ‹€κ³  λ΄…λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ A 섬과 B 섬 사이에 닀리가 있고, B 섬과 C 섬 사이에 닀리가 있으면 A 섬과 C 섬은 μ„œλ‘œ 톡행 κ°€λŠ₯ν•©λ‹ˆλ‹€.

[μ œν•œμ‚¬ν•­]

  • μ„¬μ˜ 개수 n은 1 이상 100 μ΄ν•˜μž…λ‹ˆλ‹€.
  • costs의 κΈΈμ΄λŠ” ((n - 1)*n)/2μ΄ν•˜μž…λ‹ˆλ‹€.
  • μž„μ˜μ˜ i에 λŒ€ν•΄, costs(i)(0)와 costs(i)(1)μ—λŠ” 닀리가 μ—°κ²°λ˜λŠ” 두 μ„¬μ˜ λ²ˆν˜Έκ°€ λ“€μ–΄ 있고, costs(i)(2)μ—λŠ” 이 두 섬을 μ—°κ²°ν•˜λŠ” 닀리λ₯Ό 건섀할 λ•Œ λ“œλŠ” λΉ„μš©μž…λ‹ˆλ‹€.
  • 같은 연결은 두 번 주어지지 μ•ŠμŠ΅λ‹ˆλ‹€. λ˜ν•œ μˆœμ„œκ°€ λ°”λ€Œλ”λΌλ„ 같은 μ—°κ²°λ‘œ λ΄…λ‹ˆλ‹€. 즉 0κ³Ό 1 사이λ₯Ό μ—°κ²°ν•˜λŠ” λΉ„μš©μ΄ μ£Όμ–΄μ‘Œμ„ λ•Œ, 1κ³Ό 0의 λΉ„μš©μ΄ 주어지지 μ•ŠμŠ΅λ‹ˆλ‹€.
  • λͺ¨λ“  섬 μ‚¬μ΄μ˜ 닀리 건섀 λΉ„μš©μ΄ 주어지지 μ•ŠμŠ΅λ‹ˆλ‹€. 이 경우, 두 섬 μ‚¬μ΄μ˜ 건섀이 λΆˆκ°€λŠ₯ν•œ κ²ƒμœΌλ‘œ λ΄…λ‹ˆλ‹€.
  • μ—°κ²°ν•  수 μ—†λŠ” 섬은 주어지지 μ•ŠμŠ΅λ‹ˆλ‹€.

[μ½”λ“œμž‘μ„±]

1. μœ λ‹ˆμ˜¨ νŒŒμΈλ“œ κ΅¬ν˜„

def union(parent, x, y):
	x = find(parent, x)
    y = find(parent, y)
    if x == y: return
    parent[x] = y
    
def find(parent, x):
	if parent[x] == x: return x
    parent[x] = find(parent, parent[x])
    return parent[x]

2. κ°„μ„  λΉ„μš©μ„ 적은 μˆœμ„œλŒ€λ‘œ μ •λ ¬

def solution(n, costs):
	answer = cnt = 0
    parent = [i for i in range(n)]
    costs = sorted(costs, key = lambda x:x[2])

3. μœ λ‹ˆμ˜¨ νŒŒμΈλ“œμ˜ μ„±μ§ˆμ„ μ΄μš©ν•˜μ—¬ 섬 μ—°κ²°

for i in range(len(costs):
	if find(parent, costs[i][0]) != find(parent, costs[i][1]):
    	union(parent, costs[i][0], costs[i][1])
        answer += costs[i][2]
        cnt += 1
    if cnt == n: break

[μ „μ²΄μ½”λ“œ]

def union(parent, x, y):
	x = find(parent, x)
    y = find(parent, y)
    if x == y: return
    parent[x] = y
    
def find(parent, x):
	if parent[x] == x: return x
    parent[x] = find(parent, parent[x])
    return parent[x]
    
def solution(n, costs):
	answer = cnt = 0
    parent = [i for i in range(n)]
    costs = sorted(costs, key = lambda x:x[2])
    
    for i in range(len(costs):
	if find(parent, costs[i][0]) != find(parent, costs[i][1]):
    	union(parent, costs[i][0], costs[i][1])
        answer += costs[i][2]
        cnt += 1
    if cnt == n: break
    
    return answer
profile
πŸ’» + πŸŽ₯

0개의 λŒ“κΈ€