문제 : https://www.acmicpc.net/problem/1049
Day Of Mourning의 기타리스트 강토가 사용하는 기타에서 N개의 줄이 끊어졌다. 따라서 새로운 줄을 사거나 교체해야 한다. 강토는 되도록이면 돈을 적게 쓰려고 한다. 6줄 패키지를 살 수도 있고, 1개 또는 그 이상의 줄을 낱개로 살 수도 있다.
끊어진 기타줄의 개수 N과 기타줄 브랜드 M개가 주어지고, 각각의 브랜드에서 파는 기타줄 6개가 들어있는 패키지의 가격, 낱개로 살 때의 가격이 주어질 때, 적어도 N개를 사기 위해 필요한 돈의 수를 최소로 하는 프로그램을 작성하시오.
입력
첫째 줄에 N과 M
N<=100, 자연수,
M<= 50, 자연수
둘째 줄부터 M개의 줄
각 브랜드의 (패키지 가격) (낱개의 가격)
0 <= 가격 <=1,000 정수
출력
첫째 줄에 기타줄을 적어도 N개 사기 위해 필요한 돈의 최솟값
정답 코드
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 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.math.MathContext; import java.util.StringTokenizer; public class BOJ1049 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine(), " "); // 기타줄 N 개 M개의 브랜드 int N = Integer.parseInt(st.nextToken()); int M = Integer.parseInt(st.nextToken()); int minSix = 1000; int minOne = 1000; // 6개 묶음 최저가, 낱개 최저가 구하기 for(int i=0; i < M; i++) { st = new StringTokenizer(br.readLine()); int sixP = Integer.parseInt(st.nextToken()); int oneP = Integer.parseInt(st.nextToken()); minSix = minSix <= sixP ? minSix : sixP; minOne = minOne <= oneP ? minOne : oneP; } int res = 0; // 6개 묶음보다 낱개가 저렴한 경우 -> 낱개로 모두 구매 if(minSix >= minOne*6) { res = minOne * N; } else { // 묶음 구매 필요 int quotien = N / 6; // 6개 묶음 개수 int remainder = N % 6; // 묶음 나머지 if(remainder != 0) { // 6개 묶음으로 넉넉하게 구매하는 경우와 개수 맞춰서 사는 경우 중 더 저렴한 것 res = Math.min(minSix * quotien + remainder * minOne, minSix * (quotien + 1)); } else { // 6개 묶음 res = minSix * quotien; } } System.out.println(res); } } | cs |
가장 저렴한 가격을 구하는 문제이다.
일단 묶음 최저가와 낱개 최저가만 알면 나머지 숫자는 의미 없다.
입력된 가격을 모두 배열에 담으려다가 최저가를 갱신하는 방법으로 바꿨다.
경우의수
1> 묶음보다 낱개가 저렴한 경우
2> 묶음 구매 필요한 경우
1) 묶음으로 넉넉하게 구매하는게 저렴한 경우
2) 낱개는 낱개로 사는게 저렴한 경우
각각 결과를 계산한 후 출력했다.
'발전 > JAVA' 카테고리의 다른 글
[백준] 1292번 쉽게 푸는 문제 자바(JAVA) (0) | 2022.04.06 |
---|---|
[백준] 1002 터렛 풀이, 정답코드, 채점결과 (0) | 2022.01.31 |
[백준]1010번 다리놓기 풀이 코드/입출력 방식에 따른 성능 개선 (0) | 2022.01.31 |
[java] BigInteger (java.math) - 백준 1271번, 2338번 (0) | 2021.09.11 |
[Java] 큰 따옴표(" ")와 작은 따옴표(' ') 차이 (1) | 2021.07.14 |