-
[BOJ] 나무꾼 이다솜알고리즘 2024. 5. 9. 18:41
문제
이다솜은 나무꾼이다. 이다솜은 산신령이 준 금도끼와 은도끼를 이용해서 나무를 열심히 했다. 나무가 끝난 후에 나무들을 쳐다보면서 내가 왜 나무를 하면서 살까 생각하다가,
나무가 엄청나게 값어치가 있다는 것을 알고 나무를 팔러 시장에 가기로 했다.
지역 목재상에서 이다솜의 나무를 사려고 했지만, 너무 길이가 제멋대로여서 나무를 사는 것을 거절을 했다. 목재상의 조건은 일단 팔려고 하는 나무의 길이를 전부 같게 만들어 오라는 것이었다.
(나무의 길이는 자연수로) 이다솜은 나무를 하나씩 여러 번 팔려고 했지만, 지역 목재상의 주인은 한 사람에게 평생 단 한번의 판매 기회를 제공하다고 했기 때문에, 이다솜은 근처 작업장으로 가서 나무를 자르기로 했다.
작업장에서 나무를 한 번 자를 때는, C원이 든다. 그리고, 지역 목재상에서 나무를 살 때는, 한 단위에 W원씩 준다. (다른 말로 하면, K개의 나무가 있고, 길이가 L이면, 이다솜은 KLW원을 벌 수 있다.)
이다솜이 현재 가지고 있는 나무의 길이가 주어졌을 때, 이다솜이 벌 수 있는 가장 큰 돈을 구하는 프로그램을 작성하시오.
풀이
나무 도막을 1부터 잘라야 한다.
범위는 주어진 나무중에서 가장 큰 length만큼 자를 수 있다.
이때 자르는 단위가 나무보다 큰 경우가 있으므로 이때는 해당 나무는 제외하는 수 밖에 없다.따라서 완전탐색으로 1부터 maxLength까지 자르는 경우를 모두 탐색한다.
주의해야 하는 점은 C의 비용이 터무니 없이 커져버리는 경우가 있다.4 1000 1 2 1 1 1
이때는 비용이 음수가 나오므로 나무를 자르지 않는 것이 오히려 이득이다.
따라서 해당 비용이 음수가 나오는 경우를 체크해야 한다.import java.lang.*; import java.io.*; import java.util.*; class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); List<Integer> list = new ArrayList<>(); String[] str = br.readLine().split(" "); int N = Integer.parseInt(str[0]); int C = Integer.parseInt(str[1]); int W = Integer.parseInt(str[2]); for (int i = 0; i < N; i++) { int len = Integer.parseInt(br.readLine()); list.add(len); } int maxLength = Collections.max(list); long answer = 0; for (int i = 1; i <= maxLength; i++) { long sum = 0; for (int len : list) { if (i <= len) { long unit = len / i; long minusSum = 0; if (len % i != 0) { minusSum += unit; } else { minusSum += unit - 1; } long count = unit * i * W - C * minusSum; if (count > 0) { sum += count; } } } answer = Math.max(answer, sum); } System.out.println(answer); } }
728x90'알고리즘' 카테고리의 다른 글
[프로그래머스] 연속된 부분 수열의 합 (0) 2024.05.14 [프로그래머스] 디펜스 게임 (0) 2024.05.14 [BOJ] 이진검색트리 (0) 2024.05.07 [BOJ] 줄어들지 않아 (1) 2024.05.01 [BOJ] 언더프라임 (1) 2024.04.28