본문 바로가기
BOJ

[Python] 백준 1421: 나무꾼 이다솜

by 야호호코코 2024. 8. 2.
반응형

 solved.ac 기준 Silver 1

문제

이다솜은 나무꾼이다. 이다솜은 산신령이 준 금도끼와 은도끼를 이용해서 나무를 열심히 했다. 나무가 끝난 후에 나무들을 쳐다보면서 내가 왜 나무를 하면서 살까 생각하다가, 나무가 엄청나게 값어치가 있다는 것을 알고 나무를 팔러 시장에 가기로 했다.

지역 목재상에서 이다솜의 나무를 사려고 했지만, 너무 길이가 제멋대로여서 나무를 사는 것을 거절을 했다. 목재상의 조건은 일단 팔려고 하는 나무의 길이를 전부 같게 만들어 오라는 것이었다. (나무의 길이는 자연수로) 이다솜은 나무를 하나씩 여러 번 팔려고 했지만, 지역 목재상의 주인은 한 사람에게 평생 단 한번의 판매 기회를 제공하다고 했기 때문에, 이다솜은 근처 작업장으로 가서 나무를 자르기로 했다.

작업장에서 나무를 한 번 자를 때는, C원이 든다. 그리고, 지역 목재상에서 나무를 살 때는, 한 단위에 W원씩 준다. (다른 말로 하면, K개의 나무가 있고, 길이가 L이면, 이다솜은 K*L*W원을 벌 수 있다.)

이다솜이 현재 가지고 있는 나무의 길이가 주어졌을 때, 이다솜이 벌 수 있는 가장 큰 돈을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 이다솜이 가지고 있는 나무의 개수 N과 나무를 자를 때 드는 비용 C와 나무 한 단위의 가격 W이 주어진다. 둘째 줄부터 총 N개의 줄에 이다솜이 가지고 잇는 나무의 길이가 한 줄에 하나씩 주어진다. N은 50보다 작거나 같은 자연수이고, C와 W는 10,000보다 작거나 같은 자연수이다. 그리고 나무의 길이는 모두 10,000보다 작거나 같은 자연수이다.

출력

첫째 줄에 이다솜이 벌 수 있는 돈의 최댓값을 출력한다.

예제 입력 1

3 1 10
26
103
59

예제 출력 1

1770

 

정답 코드

N, C, W = map(int, input().split())
woods = [int(input()) for _ in range(N)]

result = 0

for i in range(1, max(woods)+1):
    tmp = 0

    for j in range(N):
        wood_count = woods[j] // i
        slice_count = wood_count - 1

        if woods[j] % i > 0:
            slice_count += 1

        cost = (wood_count * i * W) - (C * slice_count)

        if cost > 0:
            tmp += cost
        
    result = max(result, tmp)

print(result)

 

 실버의 난이도에도 약간 해멨던 문제인데, 그 이유는 문제에 적히지 않은 다양한 상황을 고려하지 못하였다. 일단, 문제에서는 같은 길이를 만들어 한 번에 판다고 한다. 이 말은 즉,

 

 1. 하나의 나무를 같은 길이로 여러개로 자를 수 있다.

 2. 자르고 남은 자투리는 팔지 않고 버린다.

 3. 해당 길이를 만들 수 없는 경우, 팔지도 자르지도 않는다.

 4. 팔 수 있는 경우에도 팔지 않아도 된다! 만약 자르는 비용이 더 나왔으면 그냥 자르지 말고 팔지도 말자.

 

위 세 개의 조건을 충족시키는 알고리즘으로 구현해야한다.

반응형

'BOJ' 카테고리의 다른 글

[Python] 백준 25556: 포스택  (0) 2024.08.03
[Python] 백준 20115: 에너지 드링크  (0) 2024.08.01
[Python] 백준 30389: Suffi⊗  (0) 2024.07.31