문제 링크
주의사항
- JAVA를 사용하여 프로그램을 사용하였습니다.
- 백준에서 코드를 작성하였을 때 아래 형태에서 Main에서 결과가 출력되어야 합니다.
public class Main{
public static void main(String[] args){
}
}
문제 설명
접근 방법
이 문제에 핵심은
1. 양념 치킨 최소 X마리와 후라이드 치킨 최소 Y마리를 구매할 때 비용 최소값을 출력합니다.
알고리즘 진행 순서.
1. 입력되는 정보들을 저장합니다.
2. 입력된 값을 기준으로 점화식을 통해 최소 비용을 결과로 출력합니다.
점화식
1. X와 Y의 중 작은 값에 대한 양념과 후라이드를 구입합니다.
양념과 후라이드를 구입할 때에는 각각의 치킨을 사는 것과 반반 치킨을 사는 것의 가격을 고려한다.
(양념 + 후라이드) > 반반 치킨 × 2 : 양념 1개, 후라이드 1개 구입
(양념 + 후라이드) < 반반 치킨 × 2 : 반반 치킨 2개 구입
2. 1번으로 남은 큰 값에 치킨 개수를 구입합니다.
남은 큰 값에 치킨을 구입할 때 반반 치킨을 사는 것과 해당 치킨을 사는 것의 가격을 고려한다.
큰 값에 치킨 > 반반 치킨 × 2 : 큰 값에 치킨 1개 구입
큰 값에 치킨 < 반반 치킨 × 2 : 반반 치킨 2개 구입
예제입력 2.
1. 입력되는 정보들을 저장합니다.
후라이드 가격 : 1500
양념 가격 : 2000
반반 가격 : 1900
후라이드 최소 마리 : 3
양념 최소 마리 : 2
2. 입력된 값을 기준으로 점화식을 통해 최소 비용을 결과로 출력합니다.
1) X와 Y의 중 작은 값에 대한 양념과 후라이드를 구입합니다.
작은 값 양념의 개수 2개를 양념과 후라이드를 구입합니다.
(양념 + 후라이드) < 반반 치킨 × 2 : 반반 치킨 2개 구입
2000 + 1500 < 1900 × 2
3500 < 3800 : 양념 2마리, 후라이드 2마리 구입
1500 × 2 + 2000 × 2 = 7000
2) 1번으로 남은 큰 값에 치킨 개수를 구입합니다.
큰 값 : 후라이드 1마리(3-2)
후라이드 > 반반 치킨 × 2 : 큰 값에 치킨 1개 구입
1500 < 1900 × 2
1500 < 3800 : 후라이드 1마리 구입
1500 × 1 = 1500
결과 : 7000 + 1500 = 8500
- BufferedReader를 사용하여 입력 값을 받았습니다.
- StringTokenizer를 통해서 입력된 값을 띄어쓰기 기준 나누었습니다.
- 후라이드와 양념이 먹어야할 작은 값을 구합니다.
- cal을 실행하여 최소 비용값을 BufferedWriter 저장하였습니다.
- BufferedWriter에 저장된 결과값을 출력하였습니다.
- cal함수는 점화식을 진행합니다.
import java.io.*;
import java.util.StringTokenizer;
public class Main {
static int A,B,C,X,Y;
public static void main(String[] args) throws IOException {
//입력값 처리하는 BufferedReader
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//결과값 출력하는 BufferedWriter
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine()," ");
A = Integer.parseInt(st.nextToken());
B = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
X = Integer.parseInt(st.nextToken());
Y = Integer.parseInt(st.nextToken());
int common;
boolean check = false;
//후라이드 X마리와 양념 Y마리의 작은값 구하기
if(X>=Y){
common = Y;
check = true;
}else
common = X;
//점화식 진행
int answer = cal(common, check);
bw.write(answer + ""); //결과 BufferedWriter 저장
bw.flush(); //결과 출력
bw.close();
br.close();
}
//점화식 진행하는 함수
static int cal(int common, boolean check){
int result = 0;
//1. X와 Y의 중 작은 값에 대한 양념과 후라이드를 구입합니다.
if(A+B >= C * 2)
result += (C*2) * common;
else
result += (A+B) * common;
//2. 1번으로 남은 큰 값에 치킨 개수를 구입합니다.
if(!check){
int size = Y - common;
if(B <= C*2)
result += B * size;
else
result += (C*2) * size;
}else{
int size = X - common;
if(A <= C*2)
result += A * size;
else
result += (C*2) * size;
}
return result;
}
}
'백준' 카테고리의 다른 글
[백준] code.plus(브루트 포스 Part 1,JAVA)16922번, 로마 숫자 만들기 (0) | 2022.08.18 |
---|---|
[백준] 단계별로 풀어보기(단계:3,반복문,JAVA)25304번, 영수증 (0) | 2022.08.17 |
[백준] code.plus(시뮬레이션과 구현,JAVA)19237번, 어른 상어 (0) | 2022.08.16 |
[백준] 단계별로 풀어보기(단계:1,입출력과 사칙연산,JAVA) 3003번, 킹, 퀸, 룩, 비숍, 나이트, 폰 (0) | 2022.08.16 |
[백준] code.plus(시뮬레이션과 구현,JAVA)19236번, 청소년 상어 (0) | 2022.08.15 |
댓글