[BOJ][๐ŸŸก5][๋ฐฑ์ค€#02212] ์„ผ์„œ

์ž‘์„ฑ:    

์—…๋ฐ์ดํŠธ:

์นดํ…Œ๊ณ ๋ฆฌ:

ํƒœ๊ทธ: , , ,

๋ฌธ์ œ ์ถœ์ฒ˜

BAEKJOON Online Judge #2212


๋ฌธ์ œ

ํ•œ๊ตญ๋„๋กœ๊ณต์‚ฌ๋Š” ๊ณ ์†๋„๋กœ์˜ ์œ ๋น„์ฟผํ„ฐ์Šคํ™”๋ฅผ ์œ„ํ•ด ๊ณ ์†๋„๋กœ ์œ„์— N๊ฐœ์˜ ์„ผ์„œ๋ฅผ ์„ค์น˜ํ•˜์˜€๋‹ค. ๋ฌธ์ œ๋Š” ์ด ์„ผ์„œ๋“ค์ด ์ˆ˜์ง‘ํ•œ ์ž๋ฃŒ๋“ค์„ ๋ชจ์œผ๊ณ  ๋ถ„์„ํ•  ๋ช‡ ๊ฐœ์˜ ์ง‘์ค‘๊ตญ์„ ์„ธ์šฐ๋Š” ์ผ์ธ๋ฐ, ์˜ˆ์‚ฐ์ƒ์˜ ๋ฌธ์ œ๋กœ, ๊ณ ์†๋„๋กœ ์œ„์— ์ตœ๋Œ€ K๊ฐœ์˜ ์ง‘์ค‘๊ตญ์„ ์„ธ์šธ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ฐ ์ง‘์ค‘๊ตญ์€ ์„ผ์„œ์˜ ์ˆ˜์‹  ๊ฐ€๋Šฅ ์˜์—ญ์„ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋‹ค. ์ง‘์ค‘๊ตญ์˜ ์ˆ˜์‹  ๊ฐ€๋Šฅ ์˜์—ญ์€ ๊ณ ์†๋„๋กœ ์ƒ์—์„œ ์—ฐ๊ฒฐ๋œ ๊ตฌ๊ฐ„์œผ๋กœ ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋œ๋‹ค. N๊ฐœ์˜ ์„ผ์„œ๊ฐ€ ์ ์–ด๋„ ํ•˜๋‚˜์˜ ์ง‘์ค‘๊ตญ๊ณผ๋Š” ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•˜๋ฉฐ, ์ง‘์ค‘๊ตญ์˜ ์œ ์ง€๋น„ ๋ฌธ์ œ๋กœ ์ธํ•ด ๊ฐ ์ง‘์ค‘๊ตญ์˜ ์ˆ˜์‹  ๊ฐ€๋Šฅ ์˜์—ญ์˜ ๊ธธ์ด์˜ ํ•ฉ์„ ์ตœ์†Œํ™”ํ•ด์•ผ ํ•œ๋‹ค. ํŽธ์˜๋ฅผ ์œ„ํ•ด ๊ณ ์†๋„๋กœ๋Š” ํ‰๋ฉด์ƒ์˜ ์ง์„ ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ , ์„ผ์„œ๋“ค์€ ์ด ์ง์„  ์œ„์˜ ํ•œ ๊ธฐ์ ์ธ ์›์ ์œผ๋กœ๋ถ€ํ„ฐ์˜ ์ •์ˆ˜ ๊ฑฐ๋ฆฌ์˜ ์œ„์น˜์— ๋†“์—ฌ ์žˆ๋‹ค๊ณ  ํ•˜์ž. ๋”ฐ๋ผ์„œ, ๊ฐ ์„ผ์„œ์˜ ์ขŒํ‘œ๋Š” ์ •์ˆ˜ ํ•˜๋‚˜๋กœ ํ‘œํ˜„๋œ๋‹ค. ์ด ์ƒํ™ฉ์—์„œ ๊ฐ ์ง‘์ค‘๊ตญ์˜ ์ˆ˜์‹  ๊ฐ€๋Šฅ์˜์—ญ์˜ ๊ฑฐ๋ฆฌ์˜ ํ•ฉ์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ๋‹จ, ์ง‘์ค‘๊ตญ์˜ ์ˆ˜์‹  ๊ฐ€๋Šฅ์˜์—ญ์˜ ๊ธธ์ด๋Š” 0 ์ด์ƒ์ด๋ฉฐ ๋ชจ๋“  ์„ผ์„œ์˜ ์ขŒํ‘œ๊ฐ€ ๋‹ค๋ฅผ ํ•„์š”๋Š” ์—†๋‹ค.


์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์„ผ์„œ์˜ ๊ฐœ์ˆ˜ N(1 โ‰ค N โ‰ค 10,000), ๋‘˜์งธ ์ค„์— ์ง‘์ค‘๊ตญ์˜ ๊ฐœ์ˆ˜ K(1 โ‰ค K โ‰ค 1000)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์…‹์งธ ์ค„์—๋Š” N๊ฐœ์˜ ์„ผ์„œ์˜ ์ขŒํ‘œ๊ฐ€ ํ•œ ๊ฐœ์˜ ์ •์ˆ˜๋กœ N๊ฐœ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ์ขŒํ‘œ ์‚ฌ์ด์—๋Š” ๋นˆ ์นธ์ด ํ•˜๋‚˜ย ์žˆ์œผ๋ฉฐ, ์ขŒํ‘œ์˜ ์ ˆ๋Œ“๊ฐ’์€ 1,000,000 ์ดํ•˜์ด๋‹ค.


์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ๋ฌธ์ œ์—์„œ ์„ค๋ช…ํ•œ ์ตœ๋Œ€ K๊ฐœ์˜ ์ง‘์ค‘๊ตญ์˜ ์ˆ˜์‹  ๊ฐ€๋Šฅ ์˜์—ญ์˜ ๊ธธ์ด์˜ ํ•ฉ์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.


์˜ˆ์ œ

์˜ˆ์ œ 1

์ž…๋ ฅ

6
2
1 6 9 3 6 7


์ถœ๋ ฅ

5


์˜ˆ์ œ 2

์ž…๋ ฅ

10
5
20 3 14 6 7 8 18 10 12 15


์ถœ๋ ฅ

7


My Sol A: DP

N = int(input())
K = int(input())
arr = sorted(list(map(int, input().split())))
dp = [[0]*N for _ in range(K)]

for j in range(1, N):
    dp[0][j] = dp[0][j-1] + arr[j] - arr[j-1]

for i in range(1, K):
    for j in range(i+1, N):
        dp[i][j] = min(dp[i][j-1] + arr[j] - arr[j-1], dp[i-1][j-1])

print(dp[K-1][N-1])

DP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ’€์—ˆ๋‹ค.

  1. ๊ฐ€๋กœ๋Š” ์„ผ์„œ์˜ ์ธ๋ฑ์Šค ์„ธ๋กœ๋Š” ์ค‘๊ณ„๊ธฐ์˜ ๊ฐœ์ˆ˜์ด๋‹ค.
  2. ์–ด๋–ค ํฌ์ธํŠธ์—์„œ ์ค‘๊ณ„๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ค‘๊ณ„๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋กœ ๋‚˜๋‰œ๋‹ค.
  3. ์–ด๋–ค ํฌ์ธํŠธ(dp[i][j])์—์„œ ์ตœ์†Œ ํฌ๊ธฐ๋Š” ์ด์ „ ์„ผ์„œ๊นŒ์ง€์˜ ์ตœ์†Œ ํฌ๊ธฐ์— ์ค‘๊ณ„๊ธฐ๋ฅผ ํ•˜๋‚˜ ๋”ํ•œ ๊ฒƒ(dp[i-1][j-1])๊ณผ ์ค‘๊ณ„๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ  ์ด์ „ ์„ผ์„œ์™€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๋”ํ•˜๋Š” ๊ฒƒ(dp[i][j-1] + arr[j] - arr[j-1])์ด ์žˆ๋‹ค.
  4. ์ด ๋‘˜ ์ค‘ ๋” ์ž‘์€ ๊ฐ’์„ ํฌ์ธํŠธ๋กœ ์ €์žฅํ•˜๊ณ  ๋„˜์–ด๊ฐ„๋‹ค.
  5. ์ด๋ ‡๊ฒŒ ๊ณ„์† ํ•˜๋‹ค๊ฐ€ dp[K-1][N-1]๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ๋œ๋‹ค.


๊ฒฐ๊ณผ

๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ

์•„๋ฌด๋ž˜๋„ 2์ฐจ์› ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ ํฌ๊ณ , ๊ทธ ๊ฐ๊ฐ์— ๋“ค์–ด๊ฐ€๋Š” ์ˆ˜๋„ ํฌ๊ธฐ๊ฐ€ ์ปค์„œ ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋ž˜์„œ 2์ฐจ์› ๋ฐฐ์—ด์ด์ง€๋งŒ ํ–‰์„ 2๊ฐœ๋งŒ ๋‚จ๊ธฐ๋Š” ๋ฐฉ์‹์„ ํ™œ์šฉํ•˜๊ณ ์ž ํ•˜์˜€๋‹ค.


My Sol B: deque

from collections import deque

N = int(input())
K = int(input())
arr = sorted(list(map(int, input().split())))

dp = [0]*N
for j in range(1, N):
    dp[j] = dp[j-1] + arr[j] - arr[j-1]
Q = deque()
Q.append(dp)

for i in range(1, K):
    Q.append([0]*N)
    for j in range(i+1, N):
        Q[1][j] = min(Q[1][j-1] + arr[j] - arr[j-1], Q[0][j-1])
    Q.popleft()

print(Q[0][-1])

๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ตœ๋Œ€ํ•œ ์ค„์ด๊ธฐ ์œ„ํ•ด deque์— ํ–‰์„ 2๊ฐœ๋งŒ ๋‚จ๊ธฐ๊ธฐ๋กœ ํ–ˆ๋‹ค. ์ด๋•Œ deque์—์„œ ํ–‰์„ popleftํ•˜๋ฉด python์˜ GC๊ฐ€ ์ด ๋ฐ์ดํ„ฐ์— ํ•ด๋‹นํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•ด์ค€๋‹ค๋Š” ๊ฒƒ์ด ์ „์ œ๋กœ ๊น”๋ ค์•ผ ํ•œ๋‹ค.


๊ฒฐ๊ณผ

๋งž์•˜์Šต๋‹ˆ๋‹ค!!


๋ชจ๋ฒ”๋‹ต์•ˆ

์ถœ์ฒ˜

import sys
input = sys.stdin.readline

n = int(input())
k = int(input())
sensor = list(map(int,input().split()))
sensor.sort()

array = []
for i in range(0,n-1):
    array.append(sensor[i+1] - sensor[i])

array.sort()

print(sum(array[:n-k]))

์–ด์ด๊ฐ€ ์—†์„ ์ •๋„๋กœ ๊ฐ„๋‹จํ•œ ํ’€์ด์˜€๋‹ค. N๊ฐœ์˜ ์„ผ์„œ ์ค‘ K๊ฐœ์˜ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋‰˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด ํฌ๊ธฐ๋ฅผ ๊ฐ€์žฅ ์ค„์ด๋ ค๋ฉด ์„ผ์„œ๊ฐ„ ์‚ฌ์ด๊ฐ€ ๊ฐ€์žฅ ํฐ ๊ฐ„๊ฒฉ๋“ค์„ ๊ทธ๋ฃน์˜ ๊ฐ„๊ฒฉ์œผ๋กœ ๋‘์–ด์•ผ ํ•จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๋•Œ๋ฌธ์— K๊ฐœ์˜ ์ง‘์ค‘๊ตญ์€ (K-1)๊ฐœ์˜ ๊ฐ„๊ฒฉ์„ ๊ฐ€์ง€๋ฏ€๋กœ ๊ฐ„๊ฒฉ๋“ค์˜ ํฌ๊ธฐ๊ฐ€ ํฐ ์ˆœ์„œ๋Œ€๋กœ (K-1)๊ฐœ๋ฅผ ๋นผ๋‚ด๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ