ALGORITHM

백준 18870 좌표 압축 (Java)

공부하는_다온 2023. 2. 28. 22:49

1. 문제 링크

 

18870번: 좌표 압축

수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다. X1, X2, ..., XN에 좌

www.acmicpc.net

 

2. 문제 및 입출력예제

 

3. 문제 풀이

일단 clone()을 이용해 배열을 복사한다.

배열을 정렬하고 그 순서대로 HashMap에 추가한다. (Map이 중복 불가이기 때문)

그러면 그 보다 작은 수의 개수는 i가 아니라 index로 별도로 구해야 한다.

 

 

4. 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;

public class Main {
	static StringBuilder sb = new StringBuilder();

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		int[] X = new int[N];

		String[] split = br.readLine().split(" ");
		for (int i = 0; i < N; i++) {
			X[i] = Integer.parseInt(split[i]);
		}
		int[] sortX = X.clone();
		Arrays.sort(sortX);
		
		HashMap<Integer, Integer> map = new HashMap<>();

		int idx = 0;
		for (int i = 0; i < N;i++) {
			if(!map.containsKey(sortX[i])) {
				map.put(sortX[i], idx++);
			} 
		}
		
		for (int i = 0; i < N; i++) {
			sb.append(map.get(X[i]) + " ");
		}
		System.out.println(sb);

	}
}