심는 순서와 자라는 시간의 관계:
최적화 목표:
import sys
input = sys.stdin.readline
N = int(input())
trees = list(map(int, input().split()))
# 나무를 자라는 시간이 오래 걸리는 순으로 정렬
trees.sort(reverse=True)
# 각 나무가 심어진 이후 자라는 시간을 계산
max_days = 0
for i in range(N):
max_days = max(max_days, trees[i] + i + 1)
# 모든 나무가 자란 이후 하루를 더해야 함
result = max_days+1
print(result)
입력:
4
4 3 2 1
풀이:
1. 정렬: [4, 3, 2, 1] (이미 정렬된 상태)
2. 계산:
출력:
5
for문 안에서의 +1은 심는 날을 정확히 계산하기 위해 더해진 것입니다. 나무를 심는 순서가 1일부터 시작하기 때문이에요!
위에는 지피티가 정리해준 거고
나는 내림차순으로 정리, 로직을 맞게 짠것같지만 시간복잡도가 N^2 나 걸리는 로직이여서 시간초과가 난 것이였다.
import sys
input = sys.stdin.readline
N = int(input())
trees = list(map(int, input().split()))
trees.sort(reverse=True)
tree_max = max(trees)
bowl = list(range(tree_max, tree_max-N, -1))
cnt = 0
while cnt != N:
for i in range(N):
if trees[i] > bowl[i]:
cnt = 0
for j in range(N):
bowl[j] += 1
break
else:
cnt += 1
result = 1+bowl[0]+1
print(result)
trees 와 같은 길이의 이미 날짜가 계산된 bowl 배열을 구해놓고,
요소요소를 하나씩 비교해가며 나무가 다 자랐는지 확인하는 방식으로 구현하였다.
하나라도 다 안자라면 bowl 배열 모든 값에 +1을 해주고 또 계속 확인하는 식으로 구했다.
괜히 복잡하게 생각한 것 같기도,,
좀 더 간결하게 식이 나오게 끔 더 머리를 굴려봐야겠다..!