BOJ #13164

LSM ·2021년 7월 11일
0


LEVEL :

Gold5


문제 요약 :

각 조들에서 키가 제일 큰사람과 작은사람의 차이의 합이 최소가 되는 조를 형성하여라. 조를 구성하는 인원은 각각 달라도 된다.


해결 방안 :

시간이 조금 걸리긴 했지만 스스로 해결 할 수 있었던 문제였다. 이전에 공부했던 문제 중 비슷한 문제가 있었던 것 같다.
일단 정렬된 리스트들에서 인덱스 i 와 i+1의 차이 값들을 저장하는 배열을 만들어 이를 다시한번 정렬 시켰다. N명을 K개의 조로 나누는 것이기에 즉, K-1개의 선으로 N을 나눌 수 있다. 그리고 선이 존재하는 구간에는 구간 간의 차이 값을 구할 필요가 없다

이 개념만 이해하면 큰 무리 없이 정렬에 필요한 O(NlogN) 시간 복잡도로 문제를 해결할 수 있을 것이다.


Solution

import sys
input = sys.stdin.readline
if __name__ == "__main__" :
    N,K = map(int,input().strip().split())
    arr = list(map(int,input().strip().split()))
    diff = [[i-1,i,arr[i]-arr[i-1]] for i in range(1,N)]
    diff.sort(key=lambda x : x[2],reverse=True)
    diff = diff[0:K-1]
    diff.sort(key=lambda x : x[1])
    start = 0
    s=0
    for i in range(len(diff)) :
        last = diff[i][1]
        s += (arr[last-1]-arr[start])
        start = last
    s += arr[N-1]-arr[start]
    print(s)

more simple Solution

import sys
input = sys.stdin.readline
if __name__ == "__main__" :
    N,K = map(int,input().strip().split())
    arr = list(map(int,input().strip().split()))
    diff = [arr[i]-arr[i-1] for i in range(1,N)]
    print(sum(sorted(diff)[:N-K]))

개념은 위에 설명한 것과 같다.
K-1개의 분할선을 그을 수있기에
총 N개의 차이값을 저장한 N-1개의 리스트에서 K-1개의 분할 영역을 제외한
(N-1)-(K-1) = N-K index 까지의 차이값들을 더해준다.

profile
개발 및 취준 일지

0개의 댓글