diff --git "a/\354\225\214\352\263\240\353\246\254\354\246\230/\355\203\220\354\232\225\354\225\214\352\263\240\353\246\254\354\246\230.md" "b/\354\225\214\352\263\240\353\246\254\354\246\230/\355\203\220\354\232\225\354\225\214\352\263\240\353\246\254\354\246\230.md" new file mode 100644 index 0000000..9de9981 --- /dev/null +++ "b/\354\225\214\352\263\240\353\246\254\354\246\230/\355\203\220\354\232\225\354\225\214\352\263\240\353\246\254\354\246\230.md" @@ -0,0 +1,53 @@ +# 탐욕 알고리즘 +현재 상황에서 가장 최선의 선택을 고르는 알고리즘이다. 탐욕 알고리즘은 동적 프로그래밍을 간단한 문제 해결에 사용하면 지나치게 많은 일은 한다는 것에서 착안하여 고안된 알고리즘이다. + +## 탐욕 알고리즘의 조건 +* 탐욕적인 선택은 항상 안전하다는 것이 보장되어야 한다. +> ```안전하다``` 라는 것은 이 선택으로 인해 전체 문제의 최적해를 도출할 수 있어야 한다는 것이다. + +* 문제의 여러 단계에서 전부 최적해가 도출되어야 한다. + +## 탐욕 알고리즘의 단계 +1. 문제의 최적해 구조를 결정 + +2. 문제의 구조에 맞게 선택 절차를 정의 + +3. 선택 절차에 따라 선택을 수행 + +4. 선택된 해가 문제의 조건을 만족하는지 검사 + +5. 조건을 만족하지 않으면 해당 해를 제외 + +6. 모든 선택이 완료되면 해답 검사 + +7. 조건을 만족하지 않으면 해답으로 인정되지 않음 + +## 탐욕 알고리즘 예시 + +거스름돈 계산 알고리즘 + +```Kotlin +fun main() = with(System.`in`.bufferedReader()) { + var money = readLine().toInt // 거스름돈 + + // 1. 선택 절차 적용 + val coins = [500, 100, 50, 10] + + var count = 0 + val map = HashMap() + + // 2. 적절성 검사 + for (i in coins) { + count += money / i + money %= i + map.put(i, money / i) + } + + // 3. 해답 검사 + if(money == 0) + for(i in map) { + println("${i.first} : ${i.second}") + } +} + +``` \ No newline at end of file