Skip to content
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

40-pknujsp #168

Merged
merged 5 commits into from
May 3, 2024
Merged

40-pknujsp #168

merged 5 commits into from
May 3, 2024

Conversation

pknujsp
Copy link
Collaborator

@pknujsp pknujsp commented Mar 22, 2024

πŸ”— 문제 링크

μ„Όμ„œ

βœ”οΈ μ†Œμš”λœ μ‹œκ°„

두 달전에 2μ‹œκ°„ 20λΆ„ μž‘κ³ μžˆλ‹€κ°€ μ•ˆλΌμ„œ 풀이보고 ν’€μ—ˆμŒ
μ˜€λŠ˜μ€ 20λΆ„

✨ μˆ˜λ„ μ½”λ“œ

XμΆ• 라인 μœ„μ— N개의 μ„Όμ„œκ°€ μ„€μΉ˜λ˜μ–΄μžˆλ‹€. μ„Όμ„œμ™€ μ—°κ²°λ˜λŠ” 집쀑ꡭ을 μ΅œλŒ€ K개 κΉŒμ§€ μ„€μΉ˜ν•  수 μžˆμ„ λ•Œ, μ„€μΉ˜ν•œ λͺ¨λ“  집쀑ꡭ μˆ˜μ‹  λ²”μœ„μ˜ μ΅œμ†Œ 합을 κ΅¬ν•˜λΌ

집쀑ꡭ을 μ–΄λ–»κ²Œ μ„€μΉ˜ν•˜λŠ”μ§€μ— λŒ€ν•œ 고민으둜 λ§Žμ€ μ‹œκ°„μ„ μ†Œλͺ¨ν•œλ‹€

μ–΄λ ΅κ²Œ 갈 ν•„μš”μ—†μ΄ 문제 μ§€λ¬ΈλŒ€λ‘œ μˆ˜μ‹  λ²”μœ„κ°€ 연속적이라고 ν–ˆμœΌλ―€λ‘œ κ°€μž₯ κΈ΄ λ²”μœ„λΆ€ν„° μ œκ±°ν•΄λ‚˜κ°€λ©΄ λœλ‹€

μ΅œμ’… κ΅¬ν˜„

  1. μ„Όμ„œμ˜ μœ„μΉ˜λ“€μ„ μž…λ ₯ λ°›μ•„ μ •λ ¬ν•˜κ³ , μ€‘λ³΅λœ μœ„μΉ˜λ₯Ό μ œκ±°ν•œλ‹€
  2. λ§Œμ•½ μ§‘μ€‘κ΅­μ˜ 개수 Kκ°€ μ„Όμ„œμ˜ 개수 N보닀 λ§Žκ±°λ‚˜ κ°™λ‹€λ©΄, 0을 좜λ ₯ν•˜κ³  μ’…λ£Œν•œλ‹€
  3. μ„Όμ„œ μ‚¬μ΄μ˜ 거리λ₯Ό κ³„μ‚°ν•˜μ—¬ distances λ¦¬μŠ€νŠΈμ— μ €μž₯ν•œλ‹€. μ΄λ•Œ, κ±°λ¦¬λŠ” μ„Όμ„œλ“€ κ°„μ˜ 거리둜 κ³„μ‚°ν•œλ‹€
  4. distances 리슀트λ₯Ό λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ ¬ν•œλ‹€
  5. 결과값을 μ €μž₯ν•  λ³€μˆ˜ resultλ₯Ό 0으둜 μ΄ˆκΈ°ν™”ν•œλ‹€
  6. distances λ¦¬μŠ€νŠΈμ—μ„œ K-1번째 μΈλ±μŠ€λΆ€ν„° λκΉŒμ§€ λ°˜λ³΅ν•˜λ©΄μ„œ, 각 거리λ₯Ό result에 λ”ν•œλ‹€
  7. μ΅œμ’…μ μœΌλ‘œ κ³„μ‚°λœ result λ₯Ό 좜λ ₯ν•œλ‹€
  • κ°€μž₯ κΈ΄ 거리λ₯Ό K-1번 μ‚­μ œν•˜λŠ” 이유
    • K-1번 μ‚­μ œν•˜λŠ” μ΄μœ λŠ” 1번 μ‚­μ œν•˜λ©΄ λ²”μœ„μ˜ μ–‘μͺ½ 끝에 집쀑ꡭ을 μ„€μΉ˜ν•˜λŠ” 것이기 λ•Œλ¬Έμ΄λ‹€

μ˜ˆμ‹œ

  • μ„Όμ„œ : [1, 3, 6, 7, 9]
  • N : 5
  • K : 2
  1. μ„Όμ„œ μ‚¬μ΄μ˜ 거리 계산
    • μ„Όμ„œ κ°„μ˜ 거리λ₯Ό κ³„μ‚°ν•˜λ©΄ [2, 3, 1, 2]이 되고
    • λ‚΄λ¦Όμ°¨μˆœ μ •λ ¬ μ‹œ distancesλŠ” [3, 2, 2, 1]이 λœλ‹€
  2. μ΅œλŒ€ K-1 개의 κ°€μž₯ 큰 거리λ₯Ό 제거
    • Kκ°€ 2μ΄λ―€λ‘œ, K-1은 1이닀
    • κ°€μž₯ 큰 거리뢀터 K-1개의 거리λ₯Ό λ¬΄μ‹œν•˜κ³  λ‚˜λ¨Έμ§€ 거리λ₯Ό λ”ν•œλ‹€
    • distances λ¦¬μŠ€νŠΈμ—μ„œ κ°€μž₯ 큰 거리 ν•˜λ‚˜λ₯Ό λ¬΄μ‹œν•˜κ³ , λ‚˜λ¨Έμ§€ [2, 2, 1]을 더함
  3. 남은 distances의 합이 μ§‘μ€‘κ΅­λ“€μ˜ μˆ˜μ‹  κ°€λŠ₯ μ˜μ—­μ˜ μ΅œμ†Œ 길이가 λœλ‹€
  4. [2, 2, 1]의 합은 5μ΄λ―€λ‘œ, κ²°κ³ΌλŠ” 5

N = int(stdin.readline())
K = int(stdin.readline())
SENSORS = sorted(set(map(int, stdin.readline().split())))

if K >= N:
    print(0)
    exit()
    
distances = [SENSORS[i] - SENSORS[i - 1] for i in range(1, len(SENSORS))]
distances.sort(reverse=True)

result = 0
for i in range(K - 1, len(distances)):
    result += distances[i]
    
print(result)

πŸ“š μƒˆλ‘­κ²Œ μ•Œκ²Œλœ λ‚΄μš©

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

from heapq import *

sensor_count = int(input())
concentrate_count = int(input())

if sensor_count <= concentrate_count :
    print(0)

else:
    sensor_set = sorted(set(map(int,input().split())))
    gap_table = []
    
    total_distance = sensor_set[-1] - sensor_set[0]
    for idx in range(1,len(sensor_set)):
        heappush(gap_table,(-(sensor_set[idx]-sensor_set[idx-1])))
    
    for _ in range(concentrate_count-1):
        distance = heappop(gap_table)
        total_distance += distance

    print(total_distance)

μ €λŠ” 바보같이 νž™μ„ μ»λ„€μš”.

생각해보면 μ •λ ¬ν•œλ‹€μŒ pop()을 μ“°λ©΄ λ¬λŠ”λ°..............

γ… γ… γ… γ… γ… γ… γ… γ… γ… γ… γ… γ… γ… γ… γ… γ… γ… γ… γ… γ… γ… γ… γ… γ… γ… γ… γ… γ… 

κ·Έλž˜λ„ κ·Έ λΆ€λΆ„ λΉΌκ³ λŠ” 둜직 κ°™μŠ΅λ‹ˆλ‹€...!!

Copy link
Collaborator

@H0ngJu H0ngJu left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이번 PR을 톡해 그리디에 λŒ€ν•΄μ„œ κ³΅λΆ€ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€!

그리디λ₯Ό 보닀 λ³΄λ‹ˆ, '문제λ₯Ό μͺΌκ° λ‹€λŠ” 점'μ—μ„œ 졜근 κ³΅λΆ€ν•˜κ³  μžˆλŠ” DP와 λΉ„μŠ·ν•΄ λ³΄μ΄λ”λΌκ³ μš”. ν•˜μ§€λ§Œ '졜적의 정닡에 λ„λ‹¬ν•˜λŠ”κ°€?'λŠ” κ΄€μ μ—μ„œ 보면 κ·Έλ¦¬λ””λŠ” 보μž₯ν•˜μ§€ λͺ»ν•˜κ³ , DPλŠ” 보μž₯ν•œλ‹€λŠ” 점이 차이점인 것 κ°™μ•˜μŠ΅λ‹ˆλ‹€.

그리디 μ•Œκ³ λ¦¬μ¦˜μ€ 'ν˜„μž¬ μƒν™©μ—μ„œ κ°€μž₯ 쒋은 것을 μ„ νƒν•œλ‹€'라고 ν•  수 μžˆλŠ”λ°, 이 νŠΉμ„± λ•Œλ¬Έμ— μ•žμ—μ„œ μ–ΈκΈ‰ν–ˆλ“―μ΄ 졜적의 ν•΄λ₯Ό 보μž₯ν•˜μ§€ λͺ»ν•©λ‹ˆλ‹€.


졜적의 ν•΄λ₯Ό 보μž₯ν•˜μ§€ λͺ»ν•˜λŠ”데, 닡을 κ΅¬ν•˜κΈ° μœ„ν•œ λ°©λ²•μœΌλ‘œ 그리디λ₯Ό μ‚¬μš©ν•œλ‹€?
μ•½κ°„ λͺ¨μˆœμ΄ μžˆλŠ” 것 κ°™μ•˜μŠ΅λ‹ˆλ‹€. πŸ€”


그런데 그리디λ₯Ό μ μš©ν•˜κΈ° μœ„ν•œ 쑰건이 μžˆλ”λΌκ³ μš”

  1. νƒμš•μ  선택 속성 : μ•žμ˜ 선택이 μ΄ν›„μ˜ 선택에 영ν–₯을 μ£Όμ–΄μ„œλŠ” μ•ˆλœλ‹€.
  2. 졜적 λΆ€λΆ„ ꡬ쑰 : μ „μ²΄μ˜ 졜적 ν•΄κ°€ λΆ€λΆ„ μ„ νƒμ˜ 졜적 ν•΄λ‘œ ꡬ성될 수 μžˆλŠ” ꡬ쑰

이 점을 νŒŒμ•…ν•˜κ³  PR을 λ‹€μ‹œ λ³΄λ‹ˆ κ°€μž₯ κΈ΄ 거리λ₯Ό κΈ°μ€€μœΌλ‘œ λ‚˜λˆ„μ–΄μ„œ νŒλ‹¨ν•œλ‹€λŠ” μ μ—μ„œ 그리디 문제인 것 κ°™λ„€μš”!

@MunbinLee MunbinLee merged commit 0d347be into main May 3, 2024
1 check passed
@MunbinLee MunbinLee deleted the 40-pknujsp branch May 3, 2024 15:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants