일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- mssql
- 삼항연산자
- 썸네일 생성
- 이벤트 중복 발생 현상
- AWS EBS
- max
- indexof
- +연산자
- 레벨2
- DB 백업 파일 복원
- 배열 중복 개수 구하기
- math
- iscomposing
- 맥에서 MSSQL
- AWS
- substr
- 프로그래머스
- fill
- fluent-ffmpeg
- Filter
- MIN
- Azure Data Studio
- 자바스크립트
- 레벨1
- 객체에서 value만 가져오기
- sort
- 리액트
- map
- array
- reduce
- Today
- Total
3은로그
코딩테스트 1주차 - 그리디알고리즘 본문
그리디 알고리즘
그리디 알고리즘은 결정의 순간에 모든 경우를 보지 않고 근시안적인 최선의 선택을 하는 알고리즘이다.
즉, 지금의 선택이 앞으로 남은 선택들에 어떤 영향을 끼칠지 고려하지 않고 어떤 기준에 의해 그 시점에 최선인 것 같은 것을 선택한다. 따라서 전체적으로 봤을 때 최선이 아닐 수도 있다.
그리디 알고리즘 정당성 증명
Greed Choice 를 해도 그것이 실제로 최선의 선택이라는 것을 증명해야 하는데 이 부분이 어렵다.
1. 탐욕적 선택 속성
2. 최적 부분 구조
이 두가지 속성을 증명함으로써 그리디 알고리즘이 항상 최적해를 찾아낼 수 있다는 것을 보인다.
그리디 알고리즘을 설계하는 과정
Scheduling Classes 문제
수요일에 신청할 수 있는 과목이 n개가 있다.
각 과목의 시작, 끝 시간이 입력으로 주어질 때 어떤 과목을 선택하면 수요일에 최대한 많은 과목을 신청할 수 있을까?
가능한 Greedy Choice 는 뭐가 있을까?
1. 시작시각(S[i])이 가장 이른 class를 먼저 선택
2. 길이(F[i]-S[i])가 짧은 class를 먼저 선택
3. 서로 겹치는 class 개수가 가장 적은 것을 먼저 선택
가장 적은 것 먼저 - 3개 최대 - 4개
4. 종료시각(F[i])이 가장 이른 class를 먼저 선택
-> 이 방법을 사용하면 가장 많은 과목을 선택하는 것이 가능하다.
따라서
Greedy Choice의 기준은
- 종료시각(F[i])이 가장 이른 class를 먼저 선택이다.
그리디 알고리즘 증명
1. 탐욕적 선택 속성이란
- 탐욕적으로만 선택하더라도 최적해를 구할 수 있다는 것이다.
Scheduling Classes 문제의 경우, 탐욕적 선택 속성이 성립한다는 것은
가장 먼저 종료되는 과목을 포함하는 최적해가 반드시 존재한다는 의미이다.
Proof.
- f를 가정 먼저 종료하는 과목이라고 하자.
- X는 최적해(maximal conflict-free schedule)이고 f를 포함하지 않는다고 가정하자.
- g를 X에 포함된 것 중 가장 먼저 끝나는 과목이라고 하자.
- 그러면 f가 g보다 먼저 끝나기 때문에 X에서 g를 빼고 f를 넣어도 여전히 conflict-free이다.
-> (X - { g }) U { f }도 역시 최적해(maximal conflict-free schedule)이다. 이 증명은 가장 일찍 끝나는 과목을 선택해서 최적해를 얻는 것이 불가능한 경우는 없다는 것을 나타낸다.
2. 최적 부분 구조란
- 항상 최적의 선택만을 내려서 전체 문제의 최적해를 얻을 수 있다는 것이다. 부분 문제의 최적해에서 전체 문제의 최적해를 만들 수 있음을 보여주면 된다.
Proof.
- f를 가장 먼저 종료하는 과목이라하자.
- A를 f와 겹치지 않는(이후에 시작하는) 과목들의 집합이라하자.
- 위(탐욕적 선택 속성)에서 f를 포함한 최적해가 존재한다고 했으니까, f를 선택한 schedule 중에 최선인 것이 역시 최적해이다. 즉, f가 포함된 것중 최선인 schedule을 X라고 하면 X는 최적해이다.
- X는 f와 A에서의 최적해를 포함한다.
- GreedySchedule은 f를 선택하고 나머지에서 최적해를 찾을 수 있다.
정확성 증명의 패턴
- Greedy soultion과 optimal solution이 다르다고 가정
- 두 solution에서 처음으로 다른 부분(다른 결정을 한 부분)에 대해서
- 그 부분을 Greedy solution의 greedy choice로 대체해도 여전히 optimal solution이 된다는 것을 증명함
- 이 과정에서 수학적 귀납법을 명시적 혹은 내재적으로 사용함
'코딩테스트' 카테고리의 다른 글
백준 2178번 미로탐색 (0) | 2022.11.15 |
---|---|
코딩테스트 2주차 - 완전탐색, 시뮬레이션 백준 풀이 (14889번 스타트와 링크) (0) | 2022.11.01 |
코딩테스트 2주차 - 완전탐색, 시뮬레이션 백준 풀이(2231번 분해합) (0) | 2022.10.10 |
프로그래머스-코딩테스트 연습(그리디-체육복) (0) | 2022.10.04 |
코딩테스트 1주차 - 그리디알고리즘 백준 풀이(11047번 동전0) (0) | 2022.09.25 |