Algorithm/이론
Greedy
goakgoak
2019. 10. 3. 00:45
그리디 알고리즘은 탐욕 알고리즘 또는 욕심쟁이 알고리즘이라고 불린다.
미래를 생각하지 않고 근시안적으로 각 단계에서 가장 최선의 선택을 하는 기법.
알고리즘
1. 해 선택(Selection Procedure) : 지금 당시에 가장 최적인 해를 구한뒤, 이를 부분해 집합에 추가한다.
2. 적절성 검사(Feasibility Check): 새로운 부분해 집합이 적절한지 검사한다.
3. 해 검사(Solution Check) : 새로운 부분해 집합이 문제의 해가 되는지 검사한다. 아직 문제의 해가 완성되지 않았다면 1번 부터 다시 시작한다.
그리디 알고리즘이 통하는 몇몇 문제들이 있다.
활동선택 문제
활동 선택 문제는 쉽게 말해 한 강의실에서 여러 개의 수업을 하려고 할 때 한 번에 가장 많은 수업을 할 수 있는 경우를 고르는 것이다.
직관적으로 생각했을 때, 최적의 해를 구하기 위해서는 첫번째 활동이 최대한 일찍 끝나면 된다. 그래야 다른 활동들을 더 많이 선택할 수 있기 때문!!
1. 해 선택 : 가장 빨리 끝나는 활동을 부분해 집합에 추가한다.
2. 적절성 검사 : 부분해 집합에서 겹치는 활동시간이 있는지 검사. 활동 시간이 겹친다면 최근에 추가한 활동을 삭제하고, 다시 1번으로 돌아가 그 다음으로 빨리 끝나는 활동을 부분해 집합에 추가한다.
3 해 검사 : 모든 경우를 활동시간을 탐색하고 검사를 끝낸다.
소스코드
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
|
public class Greedy {
public class Task implements Comparable<Task> {
int num;
int start;
int end;
public Task(int num, int start, int end) {
this.num = num;
this.start = start;
this.end = end;
}
@Override
public int compareTo(Task o) {
return this.end - o.end;
}
}
public int[] go(int[][] arrays) {
int[] answer = {};
LinkedList<Task> list = new LinkedList<>();
LinkedList<Task> result = new LinkedList<>();
for (int i = 0; i < arrays.length; i++) {
list.add(new Task(i + 1, arrays[i][1], arrays[i][2]));
}
// 끝나는 시간이 짧은 순으로 정렬
// 1. 해 선택 - 가장 빨리 끝나는 활동을 부분해 집합에 추가
result.add(list.getFirst());
int last = list.getFirst().end;
// 2. 적절성 검사 - 시간이 겹치지 않는 것 집합에 추가
last = list.get(i).end;
result.add(list.get(i));
}
}
for (Task t : result) {
System.out.print(t.num + " ");
}
return answer;
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs |