728x90
📌 링크 : https://www.acmicpc.net/problem/13164
13164번: 행복 유치원
행복 유치원 원장인 태양이는 어느 날 N명의 원생들을 키 순서대로 일렬로 줄 세우고, 총 K개의 조로 나누려고 한다. 각 조에는 원생이 적어도 한 명 있어야 하며, 같은 조에 속한 원생들은 서로
www.acmicpc.net
❗️ Issue
1️⃣ 나는 이문제를 조합으로 생각하고 풀었다. 그런데 시간 복잡도를 생각해보면 그렇게 풀면 안되는 접근 방식이었다.
시간 제한이 1초이며, N의 범위가 300,000이다.
이 문제를 해결하려면 시간 복잡도가 O(NlogN) 미만이 되는 알고리즘을 설계해야 한다..!
원생들을 K개의 조로 나누는 것에 집중하는 것이 아닌, 인접하는 원생들 사이의 키 차이에 집중하여 문제에 접근하면 해결할 수 있다.
(잘못된 나의 조합 풀이 -> 런타임 에러가 났다)
nums = []
ans = 1e9
def combi(depth, start):
global nums, ans
if depth == k-1:
s = 0
score = 0
for e in nums:
if (len(li[s:e+1]) > 1):
score += li[e]-li[s]
s = e+1
if (len(li[s:]) > 1):
score += li[s:][-1] - li[s:][0]
ans = min(ans, score)
return
for i in range(start, n-1):
nums.append(p[i])
combi(depth+1, i+1)
nums.pop()
n, k = map(int, input().split())
li = list(map(int, input().split()))
p = [i for i in range(n-1)]
# 조합
combi(0, 0)
print(ans)
💡 Solution
1️⃣ 인접하는 원생들 사이의 키 차이를 리스트에 담고 정렬 후 n-k번까지 더하면 정답이된다.
전체 코드
n, k = map(int, input().split())
li = list(map(int, input().split()))
sub_li = []
for i in range(n-1):
sub_li.append(li[i+1]-li[i])
sub_li.sort()
ans = 0
for i in range(n-k):
ans += sub_li[i]
print(ans)
728x90
'코딩테스트' 카테고리의 다른 글
[그리디] 백준 11000 Gold5 강의실 배정 (0) | 2024.01.05 |
---|---|
[이진탐색] 프로그래머스 Lv4 가사 검색 (1) | 2023.12.07 |
[구현] 프로그래머스 Lv3 외벽 점검 (0) | 2023.11.29 |
[Python] 코딩테스트를 위한 파이썬 문법 - 정리 (2) | 2023.11.27 |
프로그래머스, 백준 깃허브 연동하기 및 빨간 체크박스 문제 (0) | 2023.03.11 |