PS
[백준] 18870번 : 좌표 압축 [Java]
devkdh
2025. 7. 5. 02:40

#풀이
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
int[] arr = new int[N];
Set<Integer> set = new TreeSet<>();
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i = 0; i<N; i++){
arr[i] = Integer.parseInt(st.nextToken());
set.add(arr[i]);
}
Map<Integer, Integer> map = new HashMap<>();
int index = 0;
for(int i : set){
map.put(i,index);
index++;
}
int temp;
for (int j : arr) {
temp = map.get(j);
bw.write(String.valueOf(temp) + " ");
}
bw.flush();
}
}
#성능

#정리
처음에는 중복 제거 후 리스트로 변환해 indexOf()로 좌표를 찾았지만, indexOf()는 요소마다 리스트를 순회하므로 O(N²) 시간복잡도가 되어 시간 초과가 발생했다. 이를 Map으로 변경해 값과 압축 좌표를 미리 매핑함으로써 좌표 조회를 O(1)에 할 수 있었고, 전체 시간복잡도를 O(N log N)으로 줄일 수 있었다.