오늘은 Greedy 알고리즘에 대해 공부하면서 길고 긴 하루를 보냈다. 알고리즘 공부는 항상 흥미롭지만 동시에 쉽지 않은 도전이다. 처음 Greedy라는 용어를 들었을 때, '탐욕'이라는 단어가 왜 알고리즘에 사용되는지 궁금했었다. 하지만 그 의미를 제대로 이해하는 데에는 꽤 많은 시간이 걸렸다.
Greedy 알고리즘은 현재 상황에서 가장 최선이라고 생각되는 선택을 반복하여 최종적인 해답을 찾아가는 방식이라고 배웠다. 처음에는 단순하고 직관적이라고 생각했지만, 실제 문제에 적용하려니 그렇게 간단하지 않았다. Greedy가 항상 최적의 해답을 보장하지 않는다는 점이 가장 어려웠다. 문제마다 Greedy 알고리즘을 사용할 수 있는 조건을 판단해야 했고, 그 조건을 이해하기 위해 여러 예제를 풀어야만 했다.
오늘 풀었던 문제 중 가장 기억에 남는 것은 동전 거스름돈 문제였다. "최소 개수의 동전으로 거스름돈을 줄 수 있도록 설계하라"는 문제였는데, 동전 단위가 500원, 100원, 50원, 10원처럼 정렬된 경우에는 쉽게 Greedy 알고리즘으로 해결할 수 있었다. 하지만 동전 단위가 400원, 300원, 100원처럼 특이한 경우에는 Greedy로 해결되지 않는다는 것을 알고, 문제마다 다른 접근법이 필요하다는 점을 깨달았다.
또 하나 의미 있었던 문제는 활동 선택 문제였다. 활동의 시작과 끝 시간이 주어졌을 때, 최대한 많은 활동을 선택하기 위해 끝나는 시간이 빠른 활동부터 선택하는 전략을 사용하는 것이 Greedy 알고리즘의 핵심이었다. 이 문제를 풀면서 Greedy가 단순한 선택의 반복이 아니라 문제의 구조를 분석하고 전략적으로 접근해야 한다는 점을 배울 수 있었다.
오늘 하루 중 가장 힘들었던 순간은 Greedy 알고리즘을 적용할 수 없는 문제를 만나 그것을 뒤늦게 깨달았을 때였다. 문제를 해결하려고 몇 시간을 고민하다가 결국 Greedy가 아닌 다른 방법, 예를 들면 Dynamic Programming을 사용해야 한다는 것을 알게 되었을 때의 허탈감이란... 그래도 이런 시행착오를 통해 Greedy 알고리즘의 한계와 조건을 더 명확히 알게 되었으니 헛된 시간은 아니라고 스스로를 위로해 본다.
긴 하루를 보내며 몇 가지 중요한 교훈을 얻었다. 첫째, Greedy 알고리즘은 항상 최적해를 보장하지 않으므로 문제의 특성을 파악하는 것이 중요하다. 둘째, Greedy를 적용하기 위해서는 최적 부분 구조와 탐욕적 선택 속성을 반드시 이해해야 한다. 셋째, 간단해 보이는 문제일수록 숨겨진 함정을 조심해야 한다.
오늘 하루를 마치며 내가 왜 알고리즘 공부를 시작했는지 다시 떠올려 본다. 문제를 해결하며 얻는 성취감과 조금씩 성장하는 자신을 느낄 때마다 뿌듯하다. 오늘은 Greedy 알고리즘과 씨름하느라 진이 빠졌지만, 그만큼 많은 것을 배웠고 앞으로의 문제 풀이에 큰 도움이 될 것이라고 믿는다. 탐욕적이면서도 합리적인 선택을 하라는 이 단순한 원칙이 내 머릿속에 깊이 남았다. 나의 학습 여정도 때로는 Greedy처럼 보일 수 있지만, 결국 긴 호흡으로 최적의 결과를 향해 나아가고 있음을 믿으며 오늘 하루를 마무리한다.