알고리즘 공부/백준

(Python)백준 코딩테스트 연습 - 나무꾼 이다솜(1421)

HRuler 2023. 3. 31. 15:11

1. 문제

https://www.acmicpc.net/problem/1421

 

1421번: 나무꾼 이다솜

첫째 줄에 이다솜이 가지고 있는 나무의 개수 N과 나무를 자를 때 드는 비용 C와 나무 한 단위의 가격 W이 주어진다. 둘째 줄부터 총 N개의 줄에 이다솜이 가지고 잇는 나무의 길이가 한 줄에 하나

www.acmicpc.net

2. 풀이

import sys
input = sys.stdin.readline

# n : 나무 개수, c : 나무 자르는 비용, w : 나무 단위 당 가격
n, c, w = map(int, input().split())

# n_l : 나무 길이 리스트
n_l = [int(input()) for i in range(n)]

# maxN : 가장 긴 나무 길이
maxN = max(n_l)

# maxCost : 가장 비싸게 판 가격
maxCost = 0

# 나무의 단위를 1부터 가장 긴 길이까지 반복하여 잘라준다.
for i in range(1, maxN + 1):
    # cost : 단위 별 비용
    cost = 0
    # 단위 별로 각 나무를 잘라 비용을 확인하기 위해 반복문을 돌려준다.
    for j in n_l:
        # cnt : 자른 나무 수
        # remain : 자르고 남은 나무
        cut, remain = divmod(j, i)
        # jCost : 나무 별 비용
        # 자르고 남은 나무가 있다면 자른 나무 수 만큼 커팅 비용을 누적
        if remain:
            jCost =  -(cut * c)
        # 자르고 남은 나무가 없다면 자른 나무 수 - 1 만큼 커팅 비용을 누적
        else:
            jCost = -((cut - 1) * c)
        # 자른 나무 수 * 나무 단위 당 비용 * 자른 단위를 비용에 누적
        jCost += (cut * w * i)
        if jCost < 0:
            continue
        else:
            cost += jCost
    maxCost = max(maxCost, cost)
    
print(maxCost)