[파이썬] 백준 2229번 조 짜기
작성:
백준 #2229 조 짜기
- 실력 차이가 많이 나도록 조를 짠다
- 가장 점수가 높은 학생 - 가장 점수가 낮은 학생
- 나이 순으로 정렬해서 적당히 학생들을 나누는 방식
- = 순차적으로 조를 짠다.
- 출력: 조가 잘 짜여진 정도의 최댓값
- 체크할 조건
- 1 <= N <= 1000
1. 다이나믹 프로그래밍
# dp[i] = k: 1~i+1, max(dp[i], dp[i-k] + abs(max(lst[i-k+1:i+1]) - min))
def solution(N):
lst = list(map(int, input().split()))
dp = [0] * N
for i in range(1, N):
for k in range(1, i+2):
temp = lst[i-k+1:i+1]
if k == i+1: k = i
dp[i] = max(dp[i], dp[i-k] + abs(max(temp) - min(temp)))
print(dp[-1])
if __name__ == '__main__':
solution(int(input()))
- 5636 ms
2. 최적화
# dp[i] : i번째까지 조가 잘 짜여진 최댓값
# i에서 1씩 빼면서 최댓값, 최솟값을 갱신하고 그때마다 dp[i+1] 갱신
# 최댓값, 최솟값이 갱신되지 않으면 더 볼 필요 없음.
def solution(N):
lst = list(map(int, input().split()))
dp = [0] * (N+1)
for i in range(N):
dp[i+1] = dp[i]
minval = maxval = lst[i]
j = i-1
while j >= 0 and (lst[j] < minval or lst[j] > maxval):
minval, maxval = min(lst[j], minval), max(lst[j], maxval)
dp[i+1] = max(dp[i+1], dp[j] + maxval - minval)
j -= 1
print(dp[-1])
if __name__ == '__main__':
solution(int(input()))
- 68 ms
댓글남기기