[백준] 18870번 - TreeSet, HashMap (java)

팥빵·2025년 9월 18일

Baekjoon

목록 보기
34/49

주어진 좌표를 크기 순서로 압축하여 출력하는 문제이다.

Set<> set = new TreeSet<>();

TreeSet은

  1. 들어온 값 중 중복 값을 제외하고
  2. 자동으로 오름차 순 정렬

해주는 편리한 인터페이스이다.

근데..
이번 문제의 경우 그냥 HashMap만 쓰는게 더 빠르다.


Set<Integer> set = new TreeSet<>();
for (int num : arr) set.add(num);

Map<Integer, Integer> map = new HashMap<>();
int idx = 0;
for (int num : set) {
    map.put(num, idx++);
}

▲ TreeSet과 HashMap을 둘 다 쓰는 경우

int[] sorted = arr.clone();
Arrays.sort(sorted);

Map<Integer, Integer> map = new HashMap<>();
int idx = 0;
for (int num : sorted) {
    if (!map.containsKey(num)) {
        map.put(num, idx++);
    }
}

▲ HashMap만 쓰는 경우

위 정보를 바탕으로 설계한 코드는 다음과 같다.

import java.util.*;
import java.io.*;

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));
        StringTokenizer st;
        
        int N = Integer.parseInt(br.readLine());
        int[] arr = new int[N];
        
        st = new StringTokenizer(br.readLine(), " ");
        for(int i=0; i<N; i++){
        	arr[i] = Integer.parseInt(st.nextToken());
        }
        
        int[] sorted = arr.clone();
        Arrays.sort(sorted);
        HashMap<Integer, Integer> map = new HashMap<>();
        
        int idx = 0;
        for(int num : sorted){
        	if(!map.containsKey(num)){
            	map.put(num, idx++);
            }
        }
        
        for(int i=0; i<N; i++){
        	bw.write(map.get(arr[i]) + " ");
        }
        
        br.close();
        bw.flush();
        bw.close();
    }
}
        

맞았습니다!!

profile
반갑습니다

0개의 댓글