본문 바로가기
Develop/백준 (Cpp)

[백준] 1421번 : 나무꾼 이다솜 (C++)

by Tarra 2024. 2. 13.

1421번 : 나무꾼 이다솜


문제)

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

 

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

 

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

 

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

 

 

 

입력 :

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

 

 

 

출력 :

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

 

 

 

 

풀이)

나무를 무조건 자르는 것이 아니라 잘라서 손해를 보지는 않는지, 

자른 나무를 또 잘라서 새로운 나무를 만들 수 있는지등을 체크해야했다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// 1421. 나무꾼 이다솜
#include <iostream>
#include <vector>
#include <limits.h>
 
using namespace std;
 
int n, c, w;
vector<int> vec;
 
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
 
    cin >> n >> c >> w;
 
    long long temp = 0;
    long long max_num = 0;
    for (int i = 0; i < n; i++)
    {
        cin >> temp;
        vec.push_back(temp);
        max_num = max(max_num, temp);
    }
 
    long long ans = 0;
 
    for (int i = 1; i <= max_num; i++)
    {
        long long result = 0;
 
        for (int j = 0; j < n; j++)
        {
            if (i == vec[j])
            {
                result += i * w;
            }
            else if (i < vec[j])
            {
                int t = vec[j] % i == 0 ? -1 : 0;
                if (((vec[j] / i) + t) * c < (i * w) * (vec[j] / i))
                {
                    result -= ((vec[j] / i) + t) * c;
                    result += (i * w) * (vec[j] / i);
                }
            }
        }
 
        ans = max(ans, result);
    }
 
    cout << ans;
 
    return 0;
}
 
cs

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

 

1421번: 나무꾼 이다솜

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

www.acmicpc.net