[동전0 _ 11047]
* 조건
- 각각의 금액 가치가 존재하는 동전의 종류 N개가 주어진다
- 동전의 가치는 오름차순 순으로 정렬되어있다
- 원하는 금액 K를 만들 수 있는 동전의 최소 개수를 구한다
* 알고리즘
- 최적의 상태를 발견하면 없을 때까지 계속 해당 상태를 진행: 그리디 알고리즘
* 로직(Logic)
- 동전의 가치가 제일 큰 경우부터 K 금액을 나누어 몫이 존재하면 동전의 개수로 추가시켜준다
- 나머지 값을 K로 덮어준다 (해당 금액만 구하면 되니까)
- 몫이 존재하지 않게되면 그 다음 동전을 선택하고 위 과정을 반복한다
import java.util.Scanner;
public class Problem_11047 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int k = scanner.nextInt();
int[] coins = new int[n];
for(int i=0; i<n; ++i){
coins[i] = scanner.nextInt();
}
int tmp = k;
int a=n-1;
int cnt = 0;
while (a >= 0){
int coin = coins[a];
if((tmp / coin) > 0){
cnt += tmp / coin;
tmp = tmp % coin;
}
a--;
}
System.out.println(cnt);
}
}
[회의실 배정 _ 1931]
* 조건
- 회의의 수: N (1 <= N <= 100000) -> 브루트포스를 적용하면 시간초과
- 회의의 시작 시간과 끝나는 시간이 주어진다
- 회의가 끝나는 동시에 다른 회의를 시작할 수 있다
- 최대로 사용할 수 있는 회의 수를 구한다
* 알고리즘
- 그리디 알고리즘
* 로직(Logic)
- 끝나는 시간이 짧을수록 더 많은 회의를 할 수 있기 때문에 -> 끝나는 시간을 기준으로 오름차순 정렬
- for문을 돌면서 (끝나는 시간 <= 시작시간)인 인덱스를 찾고 끝나는 시간을 해당 인덱스의 끝나는 시간으로 덮어주고 카운팅한다
import java.util.Arrays;
import java.util.Scanner;
class Time_1931 implements Comparable<Time_1931>{
public int startTime, finishTime;
public Time_1931(int startTime, int finishTime) {
this.startTime = startTime;
this.finishTime = finishTime;
}
@Override
public int compareTo(Time_1931 o) {
if(this.finishTime > o.finishTime) return 1;
else if(this.finishTime == o.finishTime){
if(this.startTime > o.startTime) return 1;
}
return -1;
}
}
public class Problem_1931 {
static int n;
static Time_1931[] timeTable;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
timeTable = new Time_1931[n];
for(int i=0; i<n; ++i){
timeTable[i] = new Time_1931(scanner.nextInt(), scanner.nextInt());
}
Arrays.sort(timeTable);
int finishTime = -1;
int count = 0;
for(int i=0; i<n; ++i){
if(timeTable[i].startTime >= finishTime){
finishTime = timeTable[i].finishTime;
count++;
}
}
System.out.println(count);
}
}
'Algorithm > Problem_백준' 카테고리의 다른 글
분할 정복(2630, 1992) (0) | 2019.11.21 |
---|---|
큐, 덱(10845, 2164) (0) | 2019.11.19 |
스택(10773, 4949) (0) | 2019.11.05 |
수학3 (5086, 1037) (0) | 2019.10.31 |
동적계획법1(2748, 1003, 1904, 9461) (0) | 2019.10.24 |