프로그래머스 181853번 뒤에서 5등까지 - Python, Java
문제 설명
정수로 이루어진 리스트 num_list가 주어집니다. num_list에서 가장 작은 5개의 수를 오름차순으로 담은 리스트를 return하도록 solution 함수를 완성해주세요.
제한 사항
- 6 ≤
num_list의 길이 ≤ 30 - 1 ≤
num_list의 원소 ≤ 100
입출력 예시
| num_list | result |
|---|---|
| [12, 4, 15, 46, 38, 1, 14] | [1, 4, 12, 14, 15] |
입출력 예 설명 1
- [12, 4, 15, 46, 38, 1, 14]를 정렬하면 [1, 4, 12, 14, 15, 38, 46]이 되고, 앞에서 부터 5개를 고르면 [1, 4, 12, 14, 15]가 됩니다.
코드 구현
Python
def solution(num_list):
num_list.sort()
return num_list[:5]
시간 복잡도 - Python
- 리스트를 오름차순으로 정렬 → $O(\log(n))$
- 처음 5개 요소 슬라이싱 → $O(1)$
- 따라서, 총 시간 복잡도는 $O(\log(n))$이다.
개선할 점 - Python
- 힙을 사용하면 불필요한 정렬을 하지 않아 데이터가 클수록 시간 복잡도가 $O(n)$에 가까워진다.
import heapq
def solution(num_list):
return heapq.nsmallest(5, num_list)
Java
import java.util.Arrays;
class Solution {
public int[] solution(int[] num_list) {
int[] answer = new int[5];
Arrays.sort(num_list);
System.arraycopy(num_list, 0, answer, 0, answer.length);
return answer;
}
}
시간 복잡도 - Java
- 배열을 오름차순으로 정렬 → $O(\log(n))$
- 처음 5개 요소 복사 → $O(1)$
- 따라서, 총 시간 복잡도는 $O(\log(n))$이다.
개선할 점 - Java
- 우선순위 큐를 사용하여 최소 힙을 유지해 시간 복잡도를 $O(n)$에 가깝게 유지할 수 있다.
import java.util.PriorityQueue;
class Solution {
public int[] solution(int[] num_list) {
PriorityQueue<Integer> minHeap = new PriorityQueue<>();
for (int num : num_list) {
minHeap.add(num);
}
int[] answer = new int[5];
for (int i = 0; i < 5; i++) {
answer[i] = minHeap.poll(); // 최소값 5개 추출
}
return answer;
}
}