[알고리즘] BOJ 14247 나무 자르기

김상현·2022년 3월 28일
0

알고리즘

목록 보기
59/301

[BOJ] 14247 나무 자르기 바로가기

📍 문제

영선이는 나무꾼으로 나무를 구하러 오전에 산에 오른다. 산에는 n개의 나무가 있는데, 영선이는 하루에 한 나무씩 n일 산에 오르며 나무를 잘라갈 것이다. 하지만 이 산은 영험한 기운이 있어 나무들이 밤만 되면 매우 빠른 속도로 자라는데, 그 자라는 길이는 나무마다 다르다.

따라서, 어느 나무를 먼저 잘라가느냐에 따라서 총 구할 수 있는 나무의 양이 다른데,

나무의 처음 길이와 하루에 자라는 양이 주어졌을 때, 영선이가 얻을 수 있는 최대 나무양을 구하시오.

참고로, 자른 이후에도 나무는 0부터 다시 자라기 때문에 같은 나무를 여러 번 자를 수는 있다.


📍 입력

첫째 줄에는 나무의 개수 n개가 있다.(1≤n≤100,000) 나무는 1번부터 n번까지 있다.

다음 줄에는 첫날 올라갔을 때 나무의 길이들 Hi가 n개가 순서대로 주어진다.(1≤Hi≤100,000)

그 다음 줄에는 나무들이 자라는 길이 Ai가 n개가 순서대로 주어진다.(1≤Ai≤10,000)


📍 출력

영선이가 나무를 잘라서 구할 수 있는 최대 양을 출력하시오.


📍 풀이

✍ 코드

from sys import stdin
n = int(stdin.readline())
H = list(map(int,stdin.readline().split()))
A = list(map(int,stdin.readline().split()))
lst = []
result = 0
for i in range(n):
  lst.append([A[i],H[i]]) # [ 성장 길이, 초기 높이]
lst.sort() # 성장 길이 기준으로 정렬
for i in range(n-1,-1,-1):
  a = lst[i][0] # 성장 길이
  h = lst[i][1] # 초기 높이
  result += (h + (a * i)) # 초기 높이 + 성장 길이 * 성장 기간
print(result)
profile
목적 있는 글쓰기

0개의 댓글