HJW's IT Blog

Algorithm: 욕심쟁이 기법 본문

알고리즘

Algorithm: 욕심쟁이 기법

kiki1875 2023. 4. 14. 14:57

욕심쟁이 기법은 최적해를 구하는데에 사용되는 알고리즘중 하나로, 매 단계에서 가장 최선의 선택을 하여 최종 결과물이 최적해에 가까워 지도록 하는것이다.

욕심쟁이 기법은 매우 직관적이며 구현하기 쉽지만 최적해를 보장하지는 않는다.

 

예시) 회의실 배정 문제

한 개의 회의실이 있는데, n개의 회의 일정이 있고 이 회의실을 이용하여 회의한다. 각 회의 i에 대해 시작시간 Si 와 끝시간 Fi 가 주어진다. 각 회의가 겹치지 않으면서 가장 많은 횟수의 회의를 할 수 있도록 일정을 구하라.

 

해법: 가장 빨리 끝나는 회의부터 넣는다. 

증명: 

  • 회의들이 끝나는 시간에 따라 {1,...,n} 이라고 하자.
  • 정답은 1을 포함하거나 포함하지 않는다.
  • 1을 포함하지 않는다면...
    • 정답의 첫번째 답이 1과 겹치지 않는다면 1을 넣어 답을 하나 더 길게 만들 수 있다
    • 정답의 첫번째 답이 1과 겹친다면, 첫번째 답은 1보다 늦게 끝나므로 이를 빼고 1을 넣어도 여전히 답..
    • 즉, 1을 반드시 포함한다.

가장 가까운 점

Brute Force Algorithm

  • 모든 가능한 경우를 다 구한 뒤 ,오름차순 정렬하여 가장 첫 원소의 값을 출력
  • 시간복잡도: O(n^2 log n)

O(n log n) 시간

  • 모든 점을 x 좌표를 기준으로 정렬
  • 정렬된 점들을 가운데 기준으로 나눈다
  • 왼쪽 절반과 오른쪽 절반에 대해 각각 가장 가까운 두 점의 거리를 재귀적으로 구함
  • 왼쪽 절반과 오른쪽 절반에서 구한 가장 가까운 두 점의 거리 중 최소값을 구함
  • 중앙선을 기준으로 좌우에 위치한 점들 중에서 가장 가까운 두 점의 거리를 구함
  • 4,5번중 더 작은 값
  •  

'알고리즘' 카테고리의 다른 글

Algorithm: Binary Search  (0) 2023.04.15
Algorithm: Segment Tree  (0) 2023.04.14
Algorithm: 과반수 찾기  (0) 2023.04.14
Algorithm: 트리 지름  (0) 2023.04.14
Algorithm: 부분합(Prefix Sum)  (1) 2023.04.13