목록으로

Programming Notes

스프링 입문 3주차: TODO 프로젝트와 PriorityQueue의 만남

새로운 해가 밝았습니다! 2024년 1월 2일, 스프링 입문 3주차의 학습 내용을 돌아보며 오늘의 TIL을 시작합니다. 이번 주는 TODO 프로젝트에 집중하면서, 예상치 못한 곳에서 문제 해결의 실마리를 발견하는 경험을 했습니다. 특히 프로그래머스 '명예의 전당 (1)' 문제를...

새로운 해가 밝았습니다! 2024년 1월 2일, 스프링 입문 3주차의 학습 내용을 돌아보며 오늘의 TIL을 시작합니다. 이번 주는 TODO 프로젝트에 집중하면서, 예상치 못한 곳에서 문제 해결의 실마리를 발견하는 경험을 했습니다. 특히 프로그래머스 '명예의 전당 (1)' 문제를 풀면서 PriorityQueue라는 자료구조를 알게 된 것이 가장 큰 수확이었습니다.

예상치 못한 곳에서 만난 해결사, PriorityQueue

'명예의 전당 (1)' 문제는 매일 발표되는 가수들의 점수를 바탕으로 명예의 전당 최하위 점수를 구하는 문제입니다. 처음에는 익숙한 sort, reverse, mutable 등의 방법을 사용하여 풀이에 접근했습니다. 하지만 효율성 면에서 아쉬움이 남았고, 무엇보다 코드가 복잡해지는 문제가 있었습니다.

고민 끝에 다른 사람들의 풀이를 살펴보던 중, PriorityQueue라는 자료구조를 발견했습니다. PriorityQueue는 큐(Queue)와 유사하지만, 항목을 추가할 때 자동으로 오름차순 정렬을 수행한다는 특징을 가지고 있습니다. 또한, peek() 메서드를 사용해 맨 앞의 값(최솟값)을 조회할 수 있고, poll() 메서드를 사용해 맨 앞의 값을 반환하고 제거할 수 있습니다.

PriorityQueue를 사용하면 정렬 로직을 직접 구현할 필요 없이, 최소값 또는 최대값을 쉽게 관리할 수 있습니다. 예를 들어, '명예의 전당 (1)' 문제에서 PriorityQueue를 사용하면 다음과 같이 간단하게 코드를 작성할 수 있습니다.

  1. PriorityQueue 생성: PriorityQueue<Integer> pq = new PriorityQueue<>();
  2. 점수 추가: pq.add(score[i]);
  3. Queue 사이즈 유지: if (pq.size() > k) { pq.poll(); } (k는 명예의 전당 목록의 점수 개수)
  4. 최하위 점수 반환: answer[i] = pq.peek();

이처럼 PriorityQueue를 사용하면 복잡한 정렬 로직 없이도 효율적으로 문제를 해결할 수 있습니다. 덕분에 '명예의 전당 (1)' 문제를 더욱 간결하고 효율적인 코드로 풀 수 있었습니다.

TODO 프로젝트, 그리고 앞으로의 다짐

PriorityQueue를 통해 문제 해결 능력을 한 단계 끌어올린 경험을 바탕으로, 스프링 3주차 STEP 2 할일카드 완료 여부에 더욱 박차를 가할 것입니다. 앞으로도 새로운 기술과 지식을 배우고 익히는 데 게을리하지 않고, TODO 프로젝트를 성공적으로 마무리할 수 있도록 최선을 다하겠습니다. 꾸준한 학습과 노력을 통해 더욱 성장하는 개발자가 되겠습니다.