728x90
문제: https://school.programmers.co.kr/learn/courses/30/lessons/120835
1️⃣ 첫 번째 코드 분석 (이중 반복문)
class Solution {
public int[] solution(int[] emergency) {
int[] answer = new int[emergency.length];
for(int i = 0; i < answer.length; i++){
if(answer[i] != 0){
continue;
}
int idx = 1;
for(int j = 0; j < answer.length; j++){
if(emergency[i] < emergency[j]){
idx++;
}
}
answer[i] = idx;
}
return answer;
}
}
📌 특징
- 각 요소에 대해 다른 모든 요소와 비교하여 순위를 매김.
- 시간 복잡도: O(N²) (이중 반복문)
🔴 단점
- 성능이 좋지 않음
→ emergency의 길이가 길어질수록 성능이 급격히 저하됨. - 불필요한 if(answer[i] != 0) 검사가 포함됨 (이 코드에서는 불필요한 로직).
- 가독성이 떨어짐 (배열을 두 번 순회하여 index를 계산하는 것이 직관적이지 않음).
2️⃣ 두 번째 코드 분석 (정렬 + 해시맵)
import java.util.*;
class Solution {
public int[] solution(int[] emergency) {
int[] arr = emergency.clone();
Arrays.sort(arr);
Map<Integer, Integer> indexMap = new HashMap<>();
for(int i = 0; i < arr.length; i++) {
indexMap.put(arr[i], arr.length - i);
}
int[] answer = new int[emergency.length];
for(int i = 0; i < emergency.length; i++) {
answer[i] = indexMap.get(emergency[i]);
}
return answer;
}
}
📌 특징
- emergency 배열을 정렬하여 작은 값부터 큰 값까지 순위를 매김.
- 해시맵(indexMap)을 이용하여 각 값의 순위를 빠르게 찾음.
- 시간 복잡도: O(N log N) (정렬) + O(N) (해시맵 탐색) = O(N log N)
✅ 장점
- 성능이 훨씬 좋음
→ O(N²) 대신 O(N log N)으로 성능 개선. - 가독성이 높음
→ 정렬 후 순위를 매기는 과정이 명확하고 직관적. - 불필요한 연산을 줄임
→ 중복 비교 없이 한 번의 정렬과 해시맵 탐색만으로 순위 결정.
3️⃣ 세 번째 코드 분석 (정렬)
import java.util.Arrays;
class solution {
public int[] solution(int[] emergency) {
int n = emergency.length;
int[] answer = new int[n];
Integer[] sortedIndex = new Integer[n];
for( int i = 0; i < n; i++ ) {
sortedIndex[i] = i;
}
Arrays.sort(sortedIndex, (i1, i2)-> emergency[i2] - emergency[i1]);
for( int i = 0; i < n; i++ ) {
answer[sortedIndex[i]] = i + 1;
}
return answer;
}
}
📌 특징
- emergency 배열의 Index를 정렬.
- 정렬된 Index를 활용하여 각 값의 Rank를 매김.
- 시간 복잡도: O(N) (Index 적용) + O(N log N) (정렬) + O(N) (answer작성) = O(N log N)
✅ 장점
- 성능이 훨씬 좋음
→ O(N²) 대신 O(N log N)으로 성능 개선. - 가독성이 높음
→ 정렬 후 순위를 매기는 과정이 명확하고 직관적.
4️⃣ 네 번째 코드 분석 (우선순위 큐)
import java.util.Comparator;
import java.util.PriorityQueue;
public class Solution {
public int[] solution(int[] emergency) {
int n = emergency.length;
int[] answer = new int[n];
PriorityQueue<int[]> pq = new PriorityQueue<>(Comparator.comparingInt(o -> o[0]));
for( int i = 0; i < n; i++ ) {
pq.add(new int[]{emergency[i], i});
}
for( int i = 0; i < n; i++ ) {
answer[pq.poll()[1]] = n - i;
}
return answer;
}
}
📌 특징
- 우선순위 큐를 활용하여 정렬된 데이터를 사용.
- 시간 복잡도: O(log n) ( PriorityQueue 요소 추가) + O(N log N) ( PriorityQueue 요소 추출) = O(N log N)
🔴 단점
- 우선순위 큐 사용시 큐 값을 꺼내는 데 추가적인 시간 오버헤드 발생
🏆 결론: 세 번째 코드가 더 낫다!
- 성능: O(N log N) vs O(N²) → 두번째와 세번째 코드가 훨씬 빠름.
- 가독성: 정렬된 배열을 활용함으로써 가독성 향상
- 유지보수성: 코드가 짧고 이해하기 쉬움.
728x90
'알고리즘 문제풀이' 카테고리의 다른 글
[연습문제] 배열 회전시키기 코드 개선 (2) | 2025.02.15 |
---|---|
[ Tree ] 레드-블랙 트리 (0) | 2024.11.23 |
[ 백준 - 1068 ] 트리 (0) | 2024.11.14 |
[ 백준 - 9372 ]상준이의 여행 (2) | 2024.11.13 |
[ 백준 - 11725 ] 트리의 부모 찾기 (0) | 2024.11.12 |