λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

πŸ“š Algorithm/Baekjoon

[Baekjoon] λ°±μ€€ 13164 'ν–‰λ³΅μœ μΉ˜μ›' λ¬Έμ œν’€μ΄ 파이썬, Python, μ•Œκ³ λ¦¬μ¦˜ 정리

πŸ“ 13164 문제

행볡 μœ μΉ˜μ› 원μž₯인 νƒœμ–‘μ΄λŠ” μ–΄λŠ λ‚  Nλͺ…μ˜ 원생듀을 ν‚€ μˆœμ„œλŒ€λ‘œ 일렬둜 쀄 μ„Έμš°κ³ , 총 K개의 쑰둜 λ‚˜λˆ„λ €κ³  ν•œλ‹€. 각 μ‘°μ—λŠ” 원생이 적어도 ν•œ λͺ… μžˆμ–΄μ•Ό ν•˜λ©°, 같은 쑰에 μ†ν•œ 원생듀은 μ„œλ‘œ 인접해 μžˆμ–΄μ•Ό ν•œλ‹€. μ‘°λ³„λ‘œ μΈμ›μˆ˜κ°€ 같을 ν•„μš”λŠ” μ—†λ‹€.

μ΄λ ‡κ²Œ λ‚˜λ‰˜μ–΄μ§„ 쑰듀은 각자 단체 ν‹°μ…”μΈ λ₯Ό λ§žμΆ”λ €κ³  ν•œλ‹€. μ‘°λ§ˆλ‹€ ν‹°μ…”μΈ λ₯Ό λ§žμΆ”λŠ” λΉ„μš©μ€ μ‘°μ—μ„œ κ°€μž₯ ν‚€κ°€ 큰 원생과 κ°€μž₯ ν‚€κ°€ μž‘μ€ μ›μƒμ˜ ν‚€ 차이만큼 λ“ λ‹€. μ΅œλŒ€ν•œ λΉ„μš©μ„ 아끼고 μ‹Άμ–΄ ν•˜λŠ” νƒœμ–‘μ΄λŠ” K개의 쑰에 λŒ€ν•΄ ν‹°μ…”μΈ  λ§Œλ“œλŠ” λΉ„μš©μ˜ 합을 μ΅œμ†Œλ‘œ ν•˜κ³  μ‹Άμ–΄ν•œλ‹€. νƒœμ–‘μ΄λ₯Ό 도와 μ΅œμ†Œμ˜ λΉ„μš©μ„ κ΅¬ν•˜μž.

 

 

μž…λ ₯

μž…λ ₯의 첫 μ€„μ—λŠ” μœ μΉ˜μ›μ— μžˆλŠ” μ›μƒμ˜ 수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μžμ—°μˆ˜ N(1 ≤ N ≤ 300,000)κ³Ό λ‚˜λˆ„λ €κ³  ν•˜λŠ” 쑰의 개수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μžμ—°μˆ˜ K(1 ≤ K ≤ N)κ°€ 곡백으둜 κ΅¬λΆ„λ˜μ–΄ 주어진닀. λ‹€μŒ μ€„μ—λŠ” μ›μƒλ“€μ˜ ν‚€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” N개의 μžμ—°μˆ˜κ°€ 곡백으둜 κ΅¬λΆ„λ˜μ–΄ 쀄 μ„œ μžˆλŠ” μˆœμ„œλŒ€λ‘œ 주어진닀. νƒœμ–‘μ΄λŠ” 원생듀을 ν‚€ μˆœμ„œλŒ€λ‘œ 쀄 μ„Έμ› μœΌλ―€λ‘œ, μ™Όμͺ½μ— μžˆλŠ” 원생이 였λ₯Έμͺ½μ— μžˆλŠ” 원생보닀 크지 μ•Šλ‹€. μ›μƒμ˜ ν‚€λŠ” 109λ₯Ό λ„˜μ§€ μ•ŠλŠ” μžμ—°μˆ˜μ΄λ‹€.

 

좜λ ₯

ν‹°μ…”μΈ  λ§Œλ“œλŠ” λΉ„μš©μ΄ μ΅œμ†Œκ°€ λ˜λ„λ‘ K개의 쑰둜 λ‚˜λˆ„μ—ˆμ„ λ•Œ, ν‹°μ…”μΈ  λ§Œλ“œλŠ” λΉ„μš©μ„ 좜λ ₯ν•œλ‹€.

 

 

🧐 풀이

μ‘°λ§ˆλ‹€ ν‹°μ…”μΈ λ₯Ό λ§žμΆ”λŠ” λΉ„μš©μ€ κ°€μž₯ ν‚€ 큰 μ‚¬λžŒκ³Ό κ°€μž₯ μž‘μ€ μ‚¬λžŒμ˜ ν‚€ 차이만큼 λ“ λ‹€. 즉, μ˜†μ‚¬λžŒκ³Όμ˜ ν‚€ 차이λ₯Ό gap에 μ €μž₯ν•œ ν›„, 역정렬을 μ‹œν‚¨λ‹€. 

N, K = map(int, input().split())
height = list(map(int, input().split()))
res = 0 
gap =[]
for i in range(1, N) :
    gap.append(height[i] - height[i-1])

gap.sort(reverse=True)

res = sum(gap[K-1:])    

print(res)
728x90