파이썬 μ•Œκ³ λ¦¬μ¦˜

[μ΄μ½”ν…Œ Ch6-4] 두 λ°°μ—΄μ˜ μ›μ†Œ ꡐ체 (μ •λ ¬)

은진 2022. 1. 16. 21:32

πŸ‘©πŸ»β€πŸ’»λ¬Έμ œμ„€λͺ…

[μ΄μ½”ν…Œ Ch6-4] 두 λ°°μ—΄μ˜ μ›μ†Œ ꡐ체 (μ •λ ¬)
μ΄μ½”ν…Œ

λ™λΉˆμ΄λŠ” 두 개의 λ°°μ—΄ A와 Bλ₯Ό 가지고 μžˆλ‹€. 두 배열은 N개의 μ›μ†Œλ‘œ κ΅¬μ„±λ˜μ–΄ 있으며, λ°°μ—΄μ˜ μ›μ†ŒλŠ” λͺ¨λ‘ μžμ—°μˆ˜μ΄λ‹€. λ™λΉˆμ΄λŠ” μ΅œλŒ€ K 번의 λ°”κΏ”μΉ˜κΈ° 연산을 μˆ˜ν–‰ν•  수 μžˆλŠ”λ°, λ°”κΏ”μΉ˜κΈ° μ—°μ‚°μ΄λž€ λ°°μ—΄ A에 μžˆλŠ” μ›μ†Œ ν•˜λ‚˜μ™€ λ°°μ—΄ B에 μžˆλŠ” μ›μ†Œ ν•˜λ‚˜λ₯Ό κ³¨λΌμ„œ 두 μ›μ†Œλ₯Ό μ„œλ‘œ λ°”κΎΈλŠ” 것을 λ§ν•œλ‹€. λ™λΉˆμ΄μ˜ μ΅œμ’… λͺ©ν‘œλŠ” λ°°μ—΄ A의 λͺ¨λ“  μ›μ†Œμ˜ 합이 μ΅œλŒ€κ°€ λ˜λ„λ‘ ν•˜λŠ” 것이며, μ—¬λŸ¬λΆ„μ€ λ™λΉˆμ΄λ₯Ό λ„μ™€μ•Όν•œλ‹€.


N, K, 그리고 λ°°μ—΄ A와 B의 정보가 μ£Όμ–΄μ‘Œμ„ λ•Œ, μ΅œλŒ€ K 번의 λ°”κΏ”μΉ˜κΈ° 연산을 μˆ˜ν–‰ν•˜μ—¬ λ§Œλ“€ 수 μžˆλŠ” λ°°μ—΄ A의 λͺ¨λ“  μ›μ†Œμ˜ ν•©μ˜ μ΅œλŒ“κ°’μ„ 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ.

예λ₯Ό λ“€μ–΄ N = 5, K = 3이고, λ°°μ—΄ A와 Bκ°€ λ‹€μŒκ³Ό κ°™λ‹€κ³  ν•΄λ³΄μž.

λ°°μ—΄ A = [1, 2, 5, 4, 3]
λ°°μ—΄ B = [5, 5, 6, 6, 5]

이 경우, λ‹€μŒκ³Ό 같이 μ„Έ 번의 연산을 μˆ˜ν–‰ν•  수 μžˆλ‹€.

μ—°μ‚° 1) λ°°μ—΄ A의 μ›μ†Œ '1'κ³Ό λ°°μ—΄ B의 μ›μ†Œ '6'을 λ°”κΎΈκΈ°
μ—°μ‚° 2) λ°°μ—΄ A의 μ›μ†Œ '2'와 λ°°μ—΄ B의 μ›μ†Œ '6'을 λ°”κΎΈκΈ°
μ—°μ‚° 3) λ°°μ—΄ A의 μ›μ†Œ '3'κ³Ό λ°°μ—΄ B의 μ›μ†Œ '5'λ₯Ό λ°”κΎΈκΈ°

μ„Έ 번의 μ—°μ‚° 이후 λ°°μ—΄ A와 λ°°μ—΄ B의 μƒνƒœλŠ” λ‹€μŒκ³Ό 같이 ꡬ성될 것이닀.

λ°°μ—΄ A = [6, 6, 5, 4, 5]
λ°°μ—΄ B = [3, 5, 1, 2, 5]

μ΄λ•Œ λ°°μ—΄ A의 λͺ¨λ“  μ›μ†Œμ˜ 합은 26이 되며, 이보닀 더 합을 크게 λ§Œλ“€ μˆ˜λŠ” μ—†λ‹€.


μž…λ ₯

  • 첫 번째 쀄: N, K κ°€ 곡백으둜 κ΅¬λΆ„λ˜μ–΄ μž…λ ₯ (1 <= N <= 100,000, 0 <= K <= N)
  • 두 번째 쀄: λ°°μ—΄ A의 μ›μ†Œλ“€μ΄ 곡백으둜 κ΅¬λΆ„λ˜μ–΄ μž…λ ₯ (μ›μ†Œ a < 10,000,000인 μžμ—°μˆ˜)
  • μ„Έ 번째 쀄: λ°°μ—΄ B의 μ›μ†Œλ“€μ΄ 곡백으둜 κ΅¬λΆ„λ˜μ–΄ μž…λ ₯ (μ›μ†Œ b < 10,000,000인 μžμ—°μˆ˜)

좜λ ₯

  • μ΅œλŒ€ K번 λ°”κΏ”μΉ˜κΈ° 연산을 μˆ˜ν–‰ν•΄μ„œ κ°€μž₯ μ΅œλŒ€μ˜ 합을 κ°–λŠ” A의 λͺ¨λ“  μ›μ†Œ κ°’μ˜ 합을 좜λ ₯


μž…λ ₯ μ˜ˆμ‹œ

5 3
1 2 5 4 3
5 5 6 6 5

좜λ ₯ μ˜ˆμ‹œ

26


✍️Idea Sketch

μ•Œκ³ λ¦¬μ¦˜ : μ •λ ¬


μ‹œκ°„λ³΅μž‘λ„

νŒŒμ΄μ¬μ€ κΈ°λ³Έ μ •λ ¬ 라이브러리인 sorted()와 sort()ν•¨μˆ˜λ₯Ό μ œκ³΅ν•œλ‹€. 병합 정렬을 기반으둜 λ§Œλ“€μ–΄μ‘ŒλŠ”λ°, 병합 정렬은 일반적인 경우 퀡 정렬보닀 λŠλ¦¬μ§€λ§Œ μ΅œμ•…μ˜ κ²½μš°μ—λ„ μ‹œκ°„ λ³΅μž‘λ„ O(NlogN)을 보μž₯ν•œλ‹€.

λ¬Έμ œμ—μ„œλŠ” 두 λ°°μ—΄μ˜ μ›μ†Œκ°€ μ΅œλŒ€ 100,000κ°œκΉŒμ§€ μž…λ ₯될 수 μžˆμœΌλ―€λ‘œ O(N^2)의 μ„ νƒμ •λ ¬μ΄λ‚˜ μ‚½μž…μ •λ ¬λ‘œ κ΅¬ν˜„ν•˜λ©΄ μ‹œκ°„μ΄ˆκ³Όκ°€ λ°œμƒν•  것이닀. λ”°λΌμ„œ O(NlogN)을 보μž₯ν•˜λŠ” μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•œλ‹€.

βœοΈλ‚΄ μ†ŒμŠ€μ½”λ“œ

  • λ°°μ—΄ Bλ₯Ό μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•œλ‹€.
  • λ”°λΌμ„œ λ°°μ—΄ Bμ—μ„œ 큰 μ›μ†ŒλŠ” λ’€μͺ½μ— μžˆμœΌλ―€λ‘œ, λ’€μ—μ„œλΆ€ν„° K개의 μ›μ†Œλ₯Ό sliceν•˜μ—¬ λ°°μ—΄ A에 λ”ν•œλ‹€.
  • λ°°μ—΄ Aλ₯Ό λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ ¬ν•œ ν›„, μ•žμ—μ„œλΆ€ν„° N개만큼 sliceν•œ λ°°μ—΄μ˜ 총합(sum ν•¨μˆ˜)을 κ΅¬ν•œλ‹€.
  import sys
  si = sys.stdin.readline

  n, k = map(int, si().split())
  a = list(map(int, si().split()))
  b = sorted(map(int, si().split()))

  a += b[-k:]
  print(sum(sorted(a, reverse=True)[:n]))