❓ 문제 - 백준 기타줄 1049번 - JAVA 풀이법
출처
(https://www.acmicpc.net/problem/1049)
📝 문제해결법
1. 이 문제는 Greedy(탐욕법)으로 알고리즘을 풀었다.
- 기타줄 N개를 사기 위해 최소값을 구할 때 고려해야 할 경우는 다음이다.
- 1> 팩(6개 묶음)에서 최소가격일 때 기타줄에 사야하는 갯수만큼 팩을 구매할 때
- 2> 1개씩 파는 기타줄에서 최소 가격일 때 사야하는 기타줄의 갯수만큼 구매할 때
- 3> 팩(6개 묶음)에서 최소가격으로 기타줄에 사야하는 갯수만큼 팩을 구매하고 남은 갯수들은 1개씩 파는 기타줄의 최소가격으로 구매할 때
- 3번의 경우 팩으로 사는 갯수를 줄이고 1개씩 파는 기타줄을 더 사서 n만큼 사는 경우도 고려할 수 있지 않다 -> 그럼 최소가격이 고려되지 않는 것이다.
2. 문제를 풀면서 느낀점
- 그리디는 최솟값, 최대값을 구한 후 그것을 이용해서 답을 구하는 문제가 많은 것 같다.
💻 소스코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String[] s1 = br.readLine().split(" ");
int n = Integer.parseInt(s1[0]);
int m = Integer.parseInt(s1[1]);
int ans = Integer.MAX_VALUE;
int min_pack = Integer.MAX_VALUE;
int min_one = Integer.MAX_VALUE;
for(int i=0;i<m;i++) {
String[] s = br.readLine().split(" ");
int a = Integer.parseInt(s[0]);
int b = Integer.parseInt(s[1]);
min_pack = Math.min(min_pack, a);
min_one = Math.min(min_one, b);
}
ans = Math.min(ans, (n/6+1)*min_pack);
ans = Math.min(ans, min_one*n);
ans = Math.min(ans, (n/6)*min_pack + (n%6)*min_one);
bw.write(String.valueOf(ans));
bw.flush();
bw.close();
}
}
'알고리즘 > 알고리즘문풀' 카테고리의 다른 글
BOJ - 벽 부수고 이동하기 2206번 (JAVA) (0) | 2022.02.07 |
---|---|
BOJ - 팰린드롬 만들기 1213번 (JAVA) (0) | 2022.02.02 |
BOJ - A->B 16953번 (JAVA) (0) | 2022.01.25 |
BOJ - 시간 관리 1263번 (JAVA) (0) | 2022.01.24 |
SW Expert Academy - 등산로 조정 (python) (0) | 2021.10.23 |