[파이썬/Python] 백준 14247번: 나무 자르기

·2024년 8월 22일
0

알고리즘 문제 풀이

목록 보기
58/105
post-thumbnail

📌 문제 : 백준 14247번



📌 문제 탐색하기

n : 나무의 개수 (1n100,000)(1 ≤ n ≤ 100,000)
H : 첫날의 나무 길이들 (1Hi100,000)(1 ≤ H_{i} ≤ 100,000)
A : 나무가 자라는 길이 (1Ai10,000)(1 ≤ A_{i} ≤ 10,000)

밤마다 각각 다른 정도로 빠르게 자라는 나무들을 잘랐을 때 얻을 수 있는 최대 나무 양을 구하는 문제이다.

문제 풀이

⭐️ 나무 자르는 방법

  • 1일 나무 → 1그루, n일 간 나무를 잘라간다.
  • 나무가 자라는 길이는 각각 다르다.
  • 어느 나무를 먼저 잘라가느냐에 따라 총 구할 수 있는 나무 양이 다르다.
  • 자른 후 0부터 다시 자라기 때문에 같은 나무 여러 번 자를 수 있다.

1번째 아이디어

매일 제일 큰 나무를 자른다면 최대 나무 양을 얻을 수 있다고 생각했다.
예제 1로 테스트해보았을 때,
아래와 같이 출력이 56으로 최대 양을 보장하지 않는다는 것을 확인할 수 있었다.

나무나무1나무2나무3나무4나무5
자라는 양27341

날짜나무1나무2나무3나무4나무5총 나무 양
1132460
자른 후132406
23104806
자른 후3048016
357812216
자른 후5780228
4714114328
자른 후70114342
597148442
자른 후9708456

2번째 아이디어

n일이 지난 후 가장 적게 자리는 나무를 먼저 자르고,
마지막 날에 최대로 자란 나무를 자른다면 최댓값을 얻을 수 있지 않을까라고 생각했다.

첫날 나무 길이와 하루에 자라는 양을 튜플로 묶고, 자라는 양을 기준으로 정렬한다.
자라는 양 순서대로 매일 해당 나무를 자르고 총합을 확인한다.

나무나무1나무2나무3나무4나무5
자라는 양12347

날짜나무1나무2나무3나무4나무5총 나무 양
1612430
자른 후012436
21358106
자른 후1058109
322812179
자른 후220121717
4343162417
자른 후34302433
546643133
자른 후4664064

원하는 값을 얻을 수 있었다.
따라서 자라는 양을 오름차순 정렬 후 그 순서대로 나무를 자르는 방법으로 구현해보았다.

가능한 시간복잡도

자라는 양 기준으로 나무 오름차순 정렬 → nlog(n)n log(n)
for문으로 n만큼 돌면서 자른 나무 양 누적합 계산 → O(n)O(n)

최종 시간복잡도
nlog(n)n log(n)으로 최악의 경우 105log(105)10^5 * log(10^5)으로 2초 내에 계산이 가능하다.

알고리즘 선택

자라는 나무 길이 기준으로 정렬 후, 자라는 양이 작은 나무부터 누적합에 더하면서 총 나무 양 계산하기


📌 코드 설계하기

  1. n 입력
  2. H 입력
  3. A 입력
  4. 나무 첫날 길이, 자라는 양 튜플로 묶기
  5. 자라는 양 기준으로 나무 리스트 오름차순 정렬
  6. 자른 나무 길이 저장할 변수 정의
  7. 적게 자라는 나무 길이부터 누적합 계산
  8. 정답 출력


📌 시도 회차 수정 사항

1회차


📌 정답 코드

import sys

input = sys.stdin.readline

# n 입력
n = int(input())

# H 입력
H = list(map(int, input().split()))

# A 입력
A = list(map(int, input().split()))

# 나무 첫날 길이, 자라는 양 튜플로 묶기
tree = []
for i in range(n):
    tree.append((H[i], A[i]))

# 자라는 양 기준 정렬
tree.sort(key=lambda x: x[1])

# 자른 나무 길이 저장할 변수 정의
cut_tree = 0

# 적게 자라는 나무 길이부터 누적합 계산
for day in range(n):
    h, a = tree[day]
    cut_tree += h + a * day

# 정답 출력
print(cut_tree)
  • 결과

0개의 댓글

관련 채용 정보