목록으로

Programming Notes

DAY-24] 240102 TIL(Spring 입문 3주차 - TODO 프로젝트: 명예의 전당)

오늘은 Spring 입문 3주차 프로젝트의 TODO 리스트 중 '명예의 전당' 기능 구현에 매달렸습니다. 문제는 명예의 전당 목록에 들어갈 상위 k개의 점수를 효율적으로 관리하는 것이었죠. 처음에는 리스트를 사용하여 정렬하고, 최소값을 찾는 등의 방식으로 구현하려 했습니다....

오늘은 Spring 입문 3주차 프로젝트의 TODO 리스트 중 '명예의 전당' 기능 구현에 매달렸습니다. 문제는 명예의 전당 목록에 들어갈 상위 k개의 점수를 효율적으로 관리하는 것이었죠. 처음에는 리스트를 사용하여 정렬하고, 최소값을 찾는 등의 방식으로 구현하려 했습니다. sort(), reverse(), 그리고 리스트의 가변성을 다루는 과정에서 예상치 못한 버그들과 씨름하며 꽤 오랜 시간을 허비했습니다. 결국 어렵게 제출은 했지만, 코드가 다소 복잡하고 비효율적인 느낌을 지울 수 없었습니다.

다른 사람들의 풀이를 살펴보니, PriorityQueue라는 자바의 유용한 자료구조를 사용한 훨씬 간결하고 효율적인 코드들이 많더군요. PriorityQueue는 큐와 유사하지만, 원소 추가 시 자동으로 우선순위(이 경우 점수)에 따라 정렬되는 특징을 가지고 있습니다. 따라서 add() 메서드로 점수를 추가하면 자동으로 정렬되고, peek() 메서드로 최소값(혹은 최대값, 설정에 따라 다름)을 확인하고, poll() 메서드로 최소값을 가져오면서 동시에 제거할 수 있습니다. 명예의 전당처럼 상위 k개의 원소만 유지해야 하는 상황에서는 PriorityQueue의 크기를 k로 제한하여 관리하면, 항상 상위 k개의 점수만을 효율적으로 유지할 수 있습니다. 정렬 알고리즘을 직접 구현하거나 최소값을 찾는 로직을 작성할 필요가 없어 코드가 훨씬 깔끔해지고, 시간 복잡도도 개선되는 효과를 얻을 수 있었습니다. import java.util.PriorityQueue;만 추가하면 간편하게 사용할 수 있다는 점도 매력적입니다.

결론적으로 오늘은 PriorityQueue라는 새로운 자료구조를 배우면서, 알고리즘 문제 해결에 있어 적절한 자료구조 선택이 얼마나 중요한지를 다시 한번 깨달았습니다. 앞으로 문제를 접근할 때, 문제의 특성에 맞는 최적의 자료구조를 먼저 고려하는 습관을 들여야겠습니다. Spring 3주차 STEP 2 할일카드에 '명예의 전당' 기능 완료 체크를 하고 다음 과제로 넘어갈 수 있게 되어 뿌듯합니다. 이번 경험을 바탕으로 앞으로 더 효율적이고 깔끔한 코드를 작성할 수 있도록 노력해야겠습니다.