프로그래밍/백준 문제풀이
백준 18870: 좌표 압축(JAVA)/ 좌표 압축 알고리즘
갹둥
2023. 2. 1. 00:27
https://www.acmicpc.net/problem/18870
18870번: 좌표 압축
수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다. X1, X2, ..., XN에 좌
www.acmicpc.net
알고리즘 분류를 보면 정렬과 좌표 압축으로 분류가 되어있다.
좌표압축 알고리즘
-좌표(문제)의 범위가 너무 넓을 때 각 좌표에 인덱싱을 하여 좌표 사이 간격을 없앰
-중요한 구간이나 숫자만 갖고 가는 것
-불필요한 좌표를 날리기 or 데이터 자체를 압축 하기
-대소관계만 알면 될 때 사용함 데이터를 정렬해서 다시 순서를 부여
HashMap을 이용하여 인덱싱을 하였다. 배열을 입력 받고 배열 복사본을 만들어 정렬한 후 Map의 key로 원소를 사용하고 value로 해당 원소의 순위를 저장한다.
원본 배열에서 Map.get을 통해 해당 원소의 순위를 알아낼 수 있다.
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] arr = new int[n];
for(int i=0; i<n; i++)
arr[i] = sc.nextInt();
int[] sorted = arr.clone();
Arrays.sort(sorted);
HashMap<Integer, Integer> map = new HashMap<>();
int i=0;
for(int a: sorted) {
if(!map.containsKey(a))
map.put(a, i++);
}
StringBuilder sb = new StringBuilder();
for(int a: arr) {
sb.append(map.get(a)+" ");
}
System.out.println(sb);
}
}