본문 바로가기
  • 개발 삽질 블로그
프로그래밍/백준 문제풀이

백준 18870: 좌표 압축(JAVA)/ 좌표 압축 알고리즘

by 갹둥 2023. 2. 1.

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);
	}
}

 

'프로그래밍 > 백준 문제풀이' 카테고리의 다른 글

백준 12789: 도키도키 간식드리미(Java)  (0) 2023.12.19
백준 14501: 퇴사 (Java)  (0) 2023.11.03
백준 1463: 1로 만들기  (1) 2022.11.30
백준 6603: 로또(JAVA)  (0) 2022.11.30
백준 1182: 부분수열의 합  (1) 2022.11.17