πŸ‘©πŸ»‍🌾

[λ°±μ€€/Python] 1033번 μΉ΅ν…ŒμΌ λ³Έλ¬Έ

μ½”λ”©ν…ŒμŠ€νŠΈ/λ°±μ€€(BOJ)

[λ°±μ€€/Python] 1033번 μΉ΅ν…ŒμΌ

μ₯¬μŠ€μ΄ 2023. 3. 16. 20:42
728x90

1οΈβƒ£λ¬Έμ œ μ„€λͺ…

august14λŠ” μ„Έμƒμ—μ„œ κ°€μž₯ λ§›μžˆλŠ” μΉ΅ν…ŒμΌμ΄λ‹€. 이 μΉ΅ν…ŒμΌμ„ λ§Œλ“œλŠ” μ •ν™•ν•œ 방법은 아직 세상에 κ³΅κ°œλ˜μ§€ μ•Šμ•˜μ§€λ§Œ, λ“€μ–΄κ°€λŠ” 재료 Nκ°œλŠ” κ³΅κ°œλ˜μ–΄ μžˆλ‹€.

κ²½κ·Όμ΄λŠ” 인터넷 검색을 ν†΅ν•΄μ„œ 재료 쌍 N-1개의 λΉ„μœ¨μ„ μ•Œμ•„λƒˆκ³ , 이 λΉ„μœ¨μ„ μ΄μš©ν•΄μ„œ μΉ΅ν…ŒμΌμ— λ“€μ–΄κ°€λŠ” 전체 재료의 λΉ„μœ¨μ„ μ•Œμ•„λ‚Ό 수 μžˆλ‹€.

총 재료 쌍 N-1개의 λΉ„μœ¨μ΄ μž…λ ₯으둜 주어진닀. μ΄λ•Œ, μΉ΅ν…ŒμΌμ„ λ§Œλ“œλŠ”λ° ν•„μš”ν•œ 각 재료의 양을 κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. μ΄λ•Œ, ν•„μš”ν•œ 재료의 μ§ˆλŸ‰μ„ λͺ¨λ‘ λ”ν•œ 값이 μ΅œμ†Œκ°€ λ˜μ–΄μ•Ό ν•œλ‹€. μΉ΅ν…ŒμΌμ„ λ§Œλ“œλŠ” 재료의 양은 μ •μˆ˜μ΄κ³ , 총 μ§ˆλŸ‰μ€ 0보닀 μ»€μ•Όν•œλ‹€.

λΉ„μœ¨μ€ "a b p q"와 같은 ν˜•μ‹μ΄κ³ , a번 재료의 μ§ˆλŸ‰μ„ b번 재료의 μ§ˆλŸ‰μœΌλ‘œ λ‚˜λˆˆ 값이 p/qλΌλŠ” λœ»μ΄λ‹€.

2οΈβƒ£μž…λ ₯

첫째 쀄에 august14λ₯Ό λ§Œλ“œλŠ”λ° ν•„μš”ν•œ 재료의 개수 N이 주어지며, N은 10보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€.

λ‘˜μ§Έ 쀄뢀터 N-1개의 μ€„μ—λŠ” 재료 쌍의 λΉ„μœ¨μ΄ ν•œ 쀄에 ν•˜λ‚˜μ”© μ£Όμ–΄μ§€λŠ”λ°, 문제 μ„€λͺ…에 λ‚˜μ˜¨ ν˜•μ‹μΈ "a b p q"둜 주어진닀. μž¬λ£ŒλŠ” 0λ²ˆλΆ€ν„° N-1κΉŒμ§€μ΄λ©°, a와 bλŠ” λͺ¨λ‘ N-1보닀 μž‘κ±°λ‚˜ 같은 음이 μ•„λ‹Œ μ •μˆ˜μ΄λ‹€. p와 qλŠ” 9보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€.

3οΈβƒ£μΆœλ ₯

첫째 쀄에 μΉ΅ν…ŒμΌμ„ λ§Œλ“œλŠ”λ° ν•„μš”ν•œ 각 재료의 μ§ˆλŸ‰μ„ 0번 μž¬λ£ŒλΆ€ν„° μˆœμ„œλŒ€λ‘œ 곡백으둜 ꡬ뢄해 좜λ ₯ν•œλ‹€.

 


πŸ‘©πŸ»‍πŸ’»μž‘μ„±ν•œ μ½”λ“œ

n = int(input())    # 재료의 수
A = [[] for _ in range(n)]  # 재료 쌍의 λΉ„μœ¨
visited = [False] * n  
D = [0] * n # 재료의 μ–‘ 정보 μ €μž₯
lcm = 1


def GCD(a, b):
    if b == 0:
        return a
    else:
        return GCD(b, a % b)


def DFS(v):
    visited[v] = True
    for i in A[v]:
        next = i[0]	# μŒμ„ μ΄λ£¨λŠ” 재료
        if not visited[next]:
            D[next] = D[v] * i[2] // i[1] 
            DFS(next)


for i in range(n-1):
    a, b, p, q = map(int, input().split())
    A[a].append((b, p, q))
    A[b].append((a, q, p))
    lcm *= (p * q // GCD(p, q))

D[0] = lcm

DFS(0)

ing_gcd = D[0]

for i in range(1, n):
    ing_gcd = GCD(ing_gcd, D[i])

for i in range(n):
    print(int(D[i] // ing_gcd), end=' ')

πŸ’‘μ½”λ“œ μ„€λͺ…

μš°μ„  ν•΄λ‹Ή 문제λ₯Ό ν‘Ό 방법을 κ°„λž΅ν•˜κ²Œ μ„€λͺ…ν•˜μžλ©΄,

μž…λ ₯ λ“€μ–΄μ˜¨ λΉ„μœ¨μ— ν•΄λ‹Ήν•˜λŠ” μˆ˜λ“€μ˜ μ΅œμ†Œκ³΅λ°°μˆ˜λ₯Ό λͺ¨λ‘ κ³±ν•œ κ°’ (κ·Έλž˜μ•Ό λΉ„μœ¨μ— ν•΄λ‹Ήν•˜λŠ” μˆ˜λ“€μ˜ μ†ŒμΈμˆ˜λ“€μ„ λ‹€ ν¬ν•¨ν•˜λ‹ˆκΉŒ)을 λ³€μˆ˜ lcm에 μ €μž₯해쀬닀.

그런 λ‹€μŒ, μž„μ˜μ˜ 재료의 양을 lcm이라고 지정해주고 ν•΄λ‹Ή μž¬λ£Œμ™€ μŒμ„ μ΄λ£¨λŠ” 재료의 양을 비둀식 (a * q = b * q)을 톡해 ꡬ해쀬닀.

이 κ³Όμ •μ—μ„œ ꡬ해진 각 μž¬λ£Œλ“€μ˜ 양을 리슀트 D에 μ €μž₯을 ν•΄μ€¬λŠ”λ° μ΄λ•Œ, D에 μ €μž₯된 μž¬λ£Œλ“€μ˜ 양은 μ΅œμ†Ÿκ°’μ΄ μ•„λ‹ˆλ―€λ‘œ D에 μ €μž₯된 κ°’λ“€μ˜ μ΅œλŒ€κ³΅μ•½μˆ˜λ₯Ό κ΅¬ν•΄μ„œ μ΅œλŒ€κ³΅μ•½μˆ˜λ‘œ λ‚˜λˆ μ£Όλ©΄ 각 μž¬λ£Œλ“€μ˜ 양이 μ΅œμ†Œκ°€ λ˜λ―€λ‘œ 닡을 ꡬ할 수 μžˆλ‹€.

 

이제 ν•¨μˆ˜ DFS()λΆ€ν„° μ½”λ“œλ₯Ό μ„€λͺ…ν•˜μžλ©΄,  

if not visited[next]:
	D[next] = D[v] * i[2] // i[1]	 # a : b = p(=i[1]) : q(=i[2]) 
   	DFS(next)

⬆️ ν•¨μˆ˜ DFS()μ—μ„œ λ§€κ°œλ³€μˆ˜λ‘œ λ“€μ–΄μ˜¨ 재료(v)와 μŒμ„ μ΄λ£¨λŠ” 재료(next)κ°€ 탐색 전일 λ•Œ, next의 μ§ˆλŸ‰μ„ λΉ„λ‘€μ‹μœΌλ‘œ κ΅¬ν•΄μ„œ D에 μ €μž₯ν•΄μ£Όκ³  μž¬κ·€ν˜ΈμΆœλ‘œ nextλ₯Ό νƒμƒ‰ν•˜λŠ” λΆ€λΆ„μ˜ μ½”λ“œμ΄λ‹€.

for i in range(1, n):
    ing_gcd = GCD(ing_gcd, D[i])

⬆️ 이 μ½”λ“œλŠ”  리슀트 D에 μ €μž₯된 재료 μ§ˆλŸ‰λ“€μ˜ μ΅œλŒ€κ³΅μ•½μˆ˜λ₯Ό κ΅¬ν•˜λŠ” μ½”λ“œμ΄κ³ , μ΄λ•Œ ꡬ해진 ing_gcd둜 D의 λͺ¨λ“  μ›μ†Œλ“€μ„ λ‚˜λˆ μ£Όλ©΄ 닡이 λœλ‹€.

728x90
Comments