탐욕 알고리즘(Greedy algorithm)
- 최적의 해를 구하는 데에 사용되는 방법
- 하나의 값을 결정할 때 마다 그 순간에 최적이라고 생각되는 것을 선택해 나아가는 방식
문제
상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다.
봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다.
상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다.
예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다.
상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오.
* 입력
- 첫째 줄에 N이 주어진다. (3 ≤ N ≤ 5000)
풀이1. 작은 수부터 탐색
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int answer = 50000;
for(int i=0; i<=N/3;i++){
if((N-i*3)%5==0){
answer = Math.min(answer,i+(N-i*3)/5);
}
}
if (answer==50000) System.out.println(-1);
else System.out.println(answer);
sc.close();
}
}
처음에는 작은 수인 3kg부터 탐색하는 방법을 선택하였다.
11의 경우 5로 먼저 나누어 떨어지게 계산한다면, -1을 리턴하게 괴는데
3으로 먼저 계산한다면 3kg 2개, 5kg 1개로 원하는 값을 얻을 수 있기 때문이다.
하지만 위와 같은 방법은 문제의 의도와는 다른 것 같아 다시 제일 큰 무게인 5kg부터 탐색하도록 알고리즘을 수정하였다.
풀이2. 큰 수부터 탐색
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int answer = 0;
while(N>0){
if(N%5==0){
answer += N/5;
break;
}
if(N<3){
answer = -1;
break;
}
N-=3;
answer += 1;
}
System.out.println(answer);
sc.close();
}
}
해결방법
- 5kg으로 해를 구할 수 있는지 먼저 탐색한다.
- 해를 구할 수 없다면, 3kg를 빼고 다시 반복문을 돌린다. 이때 이미 3kg가 하나 필요하다는 의미이므로 answer에 1을 더해준다.
- 5kg으로 나누어 떨어진다면 반복문을 종료한다.
- 5kg으로 나누어 떨어지지 않으면서, 남은 설탕의 무게가 3kg보다 적다면 해를 구할 수 없다는 의미이므로 answer에 -1 값을 준다.
https://www.acmicpc.net/problem/2839
'Algorithm > Baekjoon Oline Judge - Java' 카테고리의 다른 글
[백준] 11650_좌표정렬하기 / Arrays.sort( ) 람다식 (0) | 2024.05.26 |
---|---|
[백준] 10825_숫자카드 / 이진탐색 * (0) | 2024.05.26 |
[백준] 2750_수정렬하기 / 선택정렬, 버블정렬, 삽입정렬 (0) | 2024.05.26 |
[백준] 1269_대칭차집합 / HashSet, removeAll, retainAll, addAll (0) | 2024.05.25 |
[백준] 2798_블랙잭 / DFS, 브루트 포스 (0) | 2024.05.13 |