Problem Solving/[ν•­ν•΄99] TIL

99클럽 μ½”ν…Œ μŠ€ν„°λ”” 18일차 TIL / 그리디

geum 2024. 11. 14. 23:00

✏️ 문제

[λ°±μ€€/BOJ] 2212번: μ„Όμ„œ(https://www.acmicpc.net/problem/2212)

 

ν•œκ΅­λ„λ‘œκ³΅μ‚¬λŠ” κ³ μ†λ„λ‘œμ˜ μœ λΉ„μΏΌν„°μŠ€ν™”λ₯Ό μœ„ν•΄ κ³ μ†λ„λ‘œ μœ„μ— N개의 μ„Όμ„œλ₯Ό μ„€μΉ˜ν•˜μ˜€λ‹€. λ¬Έμ œλŠ” 이 μ„Όμ„œλ“€μ΄ μˆ˜μ§‘ν•œ μžλ£Œλ“€μ„ λͺ¨μœΌκ³  뢄석할 λͺ‡ 개의 집쀑ꡭ을 μ„Έμš°λŠ” 일인데, μ˜ˆμ‚°μƒμ˜ 문제둜, κ³ μ†λ„λ‘œ μœ„μ— μ΅œλŒ€ K개의 집쀑ꡭ을 μ„ΈμšΈ 수 μžˆλ‹€κ³  ν•œλ‹€.

각 집쀑ꡭ은 μ„Όμ„œμ˜ μˆ˜μ‹  κ°€λŠ₯ μ˜μ—­μ„ μ‘°μ ˆν•  수 μžˆλ‹€. μ§‘μ€‘κ΅­μ˜ μˆ˜μ‹  κ°€λŠ₯ μ˜μ—­μ€ κ³ μ†λ„λ‘œ μƒμ—μ„œ μ—°κ²°λœ κ΅¬κ°„μœΌλ‘œ λ‚˜νƒ€λ‚˜κ²Œ λœλ‹€. N개의 μ„Όμ„œκ°€ 적어도 ν•˜λ‚˜μ˜ μ§‘μ€‘κ΅­κ³ΌλŠ” 톡신이 κ°€λŠ₯ν•΄μ•Ό ν•˜λ©°, μ§‘μ€‘κ΅­μ˜ μœ μ§€λΉ„ 문제둜 인해 각 μ§‘μ€‘κ΅­μ˜ μˆ˜μ‹  κ°€λŠ₯ μ˜μ—­μ˜ 길이의 합을 μ΅œμ†Œν™”ν•΄μ•Ό ν•œλ‹€.

편의λ₯Ό μœ„ν•΄ κ³ μ†λ„λ‘œλŠ” ν‰λ©΄μƒμ˜ 직선이라고 κ°€μ •ν•˜κ³ , μ„Όμ„œλ“€μ€ 이 직선 μœ„μ˜ ν•œ 기점인 μ›μ μœΌλ‘œλΆ€ν„°μ˜ μ •μˆ˜ 거리의 μœ„μΉ˜μ— 놓여 μžˆλ‹€κ³  ν•˜μž. λ”°λΌμ„œ, 각 μ„Όμ„œμ˜ μ’Œν‘œλŠ” μ •μˆ˜ ν•˜λ‚˜λ‘œ ν‘œν˜„λœλ‹€. 이 μƒν™©μ—μ„œ 각 μ§‘μ€‘κ΅­μ˜ μˆ˜μ‹  κ°€λŠ₯μ˜μ—­μ˜ 거리의 ν•©μ˜ μ΅œμ†Ÿκ°’μ„ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. 단, μ§‘μ€‘κ΅­μ˜ μˆ˜μ‹  κ°€λŠ₯μ˜μ—­μ˜ κΈΈμ΄λŠ” 0 이상이며 λͺ¨λ“  μ„Όμ„œμ˜ μ’Œν‘œκ°€ λ‹€λ₯Ό ν•„μš”λŠ” μ—†λ‹€.

 

πŸ€– μž…μΆœλ ₯ μ˜ˆμ‹œ

 

🧐 λ‚œμ΄λ„/μ†Œμš” μ‹œκ°„

βœ… λ‚œμ΄λ„: solved.ac κΈ°μ€€ G5

βœ… μ†Œμš” μ‹œκ°„: ꢌμž₯ μ‹œκ°„ μ•ˆμ— μ œμΆœν•˜κΈ΄ ν–ˆμ§€λ§Œ 슀슀둜 ν‘Ό 게 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— 의미 μ—†μŒ 

βœ… ꢌμž₯ μ‹œκ°„: 1μ‹œκ°„ 30λΆ„

 

πŸ‘©‍🏫 μ°Έκ³ 

- https://www.acmicpc.net/board/view/22142

- https://yuna0125.tistory.com/48

- https://aia1235.tistory.com/104

 

πŸ’‘ 풀이

1) 문제 이해

문제λ₯Ό μ—¬λŸ¬ 번 μ½μ—ˆλŠ”λ°λ„ μž…μΆœλ ₯ μ˜ˆμ‹œ 이해가 μ•ˆλΌμ„œ μ‹œμž‘λΆ€ν„° 쉽지 μ•Šμ•˜λ‹€. λ°±μ€€ 질문 κ²Œμ‹œνŒ 뒀지닀가 λ„€μž„λ“œ μœ μ € ν•œ λΆ„μ˜ 짧고 λͺ…ν™•ν•œ μ„€λͺ…을 λ³Έ 후에야 이해할 수 μžˆμ—ˆλ‹€.

 

μž…μΆœλ ₯ μ˜ˆμ‹œ 1

 

μž…μΆœλ ₯ μ˜ˆμ‹œ 1μ—μ„œ 주어진 μ§‘μ€‘κ΅­μ˜ μˆ˜λŠ” 2개고 [1, 3] ꡬ간을 컀버할 수 μžˆλŠ” 집쀑ꡭ ν•˜λ‚˜, [6, 9] ꡬ간을 컀버할 수 μžˆλŠ” 집쀑ꡭ ν•˜λ‚˜ μ΄λ ‡κ²Œ μ„€μΉ˜ν•˜λ©΄ 전체 μˆ˜μ‹  κ°€λŠ₯μ˜μ—­ κΈΈμ΄λŠ” 2([1, 3] ꡬ간 길이)+3([6, 9] ꡬ간 길이) ν•΄μ„œ 5κ°€ λœλ‹€. 이것보닀 μˆ˜μ‹  κ°€λŠ₯μ˜μ—­ 길이λ₯Ό 더 쀄일 수 μžˆλŠ” 방법은 μ—†λ‹€.

 

λ‚΄κ°€ 문제 이해λ₯Ό μ–΄λ €μ›Œν•œ μ΄μœ λŠ” 'μ§‘μ€‘κ΅­μ˜ μ •ν™•ν•œ μœ„μΉ˜λ₯Ό 찾으렀고'ν•΄μ„œ 인 것 κ°™μ•˜λ‹€. 집쀑ꡭ을 μ„€μΉ˜ν•˜λŠ” μœ„μΉ˜κ°€ μ€‘μš”ν•œ 게 μ•„λ‹ˆλΌ 주어진 μ’Œν‘œλ₯Ό μ μ ˆν•œ κ΅¬μ—­μœΌλ‘œ λ‚˜λˆ„λŠ” 게 μ€‘μš”ν•œ 건데 μ•„μ˜ˆ ν•€νŠΈκ°€ λ‚˜κ°”μ—ˆλ‹€λŠ” 생각이 λ“ λ‹€.

 

2) 아이디어 흐름

자λ ₯으둜 λ– μ˜¬λ¦° 아이디어가 μ•„λ‹ˆλΌ λ‹€λ₯Έ λΆ„λ“€μ˜ μ½”λ“œλ₯Ό μ •λ¦¬ν•˜λ©΄μ„œ μ΄ν•΄ν•œ λ‚΄μš©μ΄λ‹€.

 

β‘  μ„Όμ„œ μ’Œν‘œ μ •λ ¬

μ’Œν‘œ 값이라고 ν–ˆκΈ° λ•Œλ¬Έμ— λ‹Ήμ—°νžˆ μ •λ ¬ν•΄μ„œ μ¨μ•Όκ² λ‹€λŠ” λŠλ‚Œμ΄ λ“€μ–΄μ„œ 이 과정은 λ°”λ‘œ λ– μ˜¬λ¦΄ 수 μžˆμ—ˆλ‹€.

 

β‘‘ μΈμ ‘ν•œ μ„Όμ„œ κ°„ 거리 차이 계산

λ”± μ •λ ¬κΉŒμ§€λ§Œ λ– μ˜¬λ¦¬κ³  μ •λ ¬ν•œ ν›„ μ’Œν‘œλ“€μ„ μ–΄λ–»κ²Œ ν™œμš©ν• μ§€ λ– μ˜¬λ¦¬μ§€ λͺ»ν–ˆλ‹€. μ΄μ›ƒν•œ μ„Όμ„œμ˜ 거리 차이λ₯Ό κ³„μ‚°ν•˜λŠ” μ΄μœ λŠ” 'μ„Όμ„œλ₯Ό λͺ‡ 개의 그룹으둜 λ‚˜λˆ„κ³  각 그룹의 μˆ˜μ‹  κ°€λŠ₯ μ˜μ—­ 길이 합을 μ΅œμ†Œν™”ν•˜κΈ° μœ„ν•΄ μ„œλ‘œ μΈμ ‘ν•œ μ„Όμ„œλ“€λΌλ¦¬ 그룹을 μ΄λ£¨λŠ” 게 κ°€μž₯ μœ λ¦¬ν•΄μ„œ' 이닀.

 

적닀 λ³΄λ‹ˆ 말이 μ’€ 길어지긴 ν–ˆμ§€λ§Œ μœ„ λ‚΄μš©μ„ ν•œ λ§ˆλ””λ‘œ μ •λ¦¬ν•˜μžλ©΄ 'κ°€κΉŒμ΄ μžˆλŠ” μ„Όμ„œλ“€λΌλ¦¬ λ¬Άμ–΄μ£ΌλŠ” 게 κ°€μž₯ 졜적의 방법'이기 λ•Œλ¬Έμ΄λ‹€.

 

β‘’  ⭐ K개의 그룹을 λ§Œλ“€κΈ° μœ„ν•΄ 거리 차이가 κ°€μž₯ 큰 ꡬ간 K-1개 끊기 ⭐

이 뢀뢄이 문제 ν’€μ΄μ˜ 핡심이라고 μƒκ°ν•œλ‹€. 거리 차이가 큰 ꡬ간 K-1개λ₯Ό λŠλŠ”λ‹€λŠ” μ˜λ―Έμ— λŒ€ν•΄ 쑰금 더 μžμ„Έν•˜κ²Œ ν’€μ–΄μ„œ 써보겠닀.

 

β…°)  경계?

- μ„Όμ„œ μ’Œν‘œκ°€ [1, 3, 6, 7, 9]라고 ν•  λ•Œ, 각 μ„Όμ„œ μ‚¬μ΄μ˜ 거리 차이가 μ‘΄μž¬ν•¨

- μ΄μ›ƒν•œ μ„Όμ„œ κ°„ 거리λ₯Ό '경계'라고 ν•œλ‹€λ©΄ [1κ³Ό 3 μ‚¬μ΄μ˜ 거리, 3κ³Ό 6 μ‚¬μ΄μ˜ 거리, 6κ³Ό 7 μ‚¬μ΄μ˜ 거리, 7κ³Ό 9 μ‚¬μ΄μ˜ 거리] 총 4개의 거리가 λ‚˜μ˜΄

- 즉 μ„Όμ„œ μ’Œν‘œκ°€ N개면 κ²½κ³„μ˜ κ°œμˆ˜λŠ” N-1개

 

β…±) K개의 그룹을 λ§Œλ“€κΈ° μœ„ν•΄ ν•„μš”ν•œ κ²½κ³„μ˜ 개수?

- 5개의 μ„Όμ„œλ₯Ό 2개의 그룹으둜 λ‚˜λˆ„λ €λ©΄ 경계 ν•˜λ‚˜κ°€ ν•„μš”ν•¨

- 즉 λ§Œλ“€κ³ μž ν•˜λŠ” 그룹이 K개면 ν•„μš”ν•œ κ²½κ³„μ˜ κ³„μˆ˜λŠ” K-1개

 

β…²) 경계 끊기?

- 경계λ₯Ό ν™œμš©ν•΄ 거리가 큰 μˆœμ„œλŒ€λ‘œ K-1개λ₯Ό μ œμ™Έν•΄μ£Όλ©΄ 됨

- K=2, μ„Όμ„œ μ’Œν‘œκ°€ [1, 3, 6, 7, 9]일 λ•Œ λ§Œλ“€μ–΄μ§€λŠ” κ²½κ³„λŠ” [2, 3, 1, 2] → 거리가 제일 큰 [3, 6] κ΅¬κ°„μ—μ„œ λŠμ–΄μ£Όκ³  1, 3 / 6, 7, 9둜 λ§Œλ“€λ©΄ 이 λ•Œμ˜ μ˜μ—­ 합이 μ΅œμ†Œ

 

3) κ΅¬ν˜„

N = int(input())

K = int(input())

sensors = sorted(list(map(int, input().split())))

diff = []

for i in range(1, N):
    diff.append(sensors[i]-sensors[i-1])

diff.sort()

print(sum(diff[:N-K]))

 

4) μ–΄λ €μ› λ˜ 점/배운 μ 

🚨 μ–΄λ €μ› λ˜ 점

  • 문제λ₯Ό μ΄ν•΄ν•˜λŠ” 것

❗ 배운 점

1) 241114 ν•­ν•΄99 그리디 μ•Œκ³ λ¦¬μ¦˜ νŠΉκ°• 정리

  • BFS/DFS, 이뢄탐색, ... 처럼 정해진 μ½”λ“œ ν˜•μ‹μ΄ μ—†κΈ° λ•Œλ¬Έμ— μ–΄λ €μšΈ 것
  • μ•Œκ³ λ¦¬μ¦˜ λŒ€μ‹  방법둠, μ „λž΅μ΄λΌλŠ” ν‘œν˜„κ³Ό ν•¨κ»˜ 쓰이기도 함
  • μž₯점) 빠름, 맀 μˆœκ°„ 졜적의 μ„ νƒλ§Œ ν•˜κΈ° λ•Œλ¬Έμ— λ©”λͺ¨λ¦¬ 효율적(ꡳ이 λͺ¨λ“  정보λ₯Ό 가지고 μžˆμ§€ μ•ŠλŠ” λŠλ‚ŒμœΌλ‘œ 이해)
  • 단점) 따져봐야 ν•˜λŠ” 쑰건이 λ§Žμ•„μ§€λ©΄ 뢀적합
  • λŒ€ν‘œμ μΈ 그리디 μœ ν˜•: μ΅œλ‹¨κ²½λ‘œ(λ‹€μ΅μŠ€νŠΈλΌ), μ΅œμ†Œ μŠ€νŒ¨λ‹ 트리 κ΄€λ ¨(크루슀칼, ν”„λ¦Ό), λ°°λ‚­ 문제, νšŒμ˜μ‹€ 선택, 동전 문제
  • ⭐ λŒ€ν‘œ μœ ν˜• 문제λ₯Ό μ œμ™Έν•œ μ΄μ™Έμ˜ λ¬Έμ œλŠ” '그리디 μ¨μ„œ 풀어야지~'ν•˜λ©΄ 였히렀 더 μ–΄λ €μ›Œν•˜λŠ” 경우λ₯Ό 많이 λ΄„
  • ⭐⭐ κ°€μž₯ 효율적인 방법이 λ­˜μ§€ 둜직 κ³ λ―Όν•œ λ‹€μŒ κ·ΈλŒ€λ‘œ κ΅¬ν˜„ν•˜κ³  'μ•„ 이게 그리디 ν’€μ΄κ΅¬λ‚˜'λ₯Ό κΉ¨λ‹¬μœΌλ©΄ 됨

2) 생각 정리

  • νŠΉκ°• λ“£κ³  λ‚˜λ‹ˆκΉŒ 그리디와 μ’€ 더 κ°€κΉŒμ›Œμ§„ λŠλ‚Œμ΄λ‹€. λͺ¨λ“  문제λ₯Ό μœ ν˜•ν™”ν•΄μ„œ μ ‘κ·Όν•˜λ €λŠ” 이 λ”±λ”±ν•œ 사고 방식을 λ©ˆμΆ”μž-!