Sliver
문제
수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다.
Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표 Xj의 개수와 같아야 한다.
X1, X2, ..., XN에 좌표 압축을 적용한 결과 X'1, X'2, ..., X'N를 출력해보자.
입력
첫째 줄에 N이 주어진다.
둘째 줄에는 공백 한 칸으로 구분된 X1, X2, ..., XN이 주어진다.
출력
첫째 줄에 X'1, X'2, ..., X'N을 공백 한 칸으로 구분해서 출력한다.
풀이
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
int N = sc.nextInt();
int[] arr = new int[N];
for(int i =0; i< N ; i++){
int num = sc.nextInt();
arr[i] = num;
}
int[] sorted = arr.clone();
Arrays.sort(sorted);
Map<Integer, Integer> map = new HashMap<>();
int index = 0;
for(int i =0; i< N ; i++){
if(!map.containsKey(sorted[i]))
map.put(sorted[i], index++);
}
for(int i =0; i< N ; i++){
sb.append(map.get(arr[i])).append(" ");
}
System.out.println(sb);
sc.close();
}
}
해결방법
좌표별 압축 후의 좌표의 데이터를 저장하기 위해 Map을 사용했다.
Key로는 압축 전 좌표를, value로는 압축 후 좌표를 저장해 주었다.
Map 자료구조를 사용한 이유는 key를 통해 value를 빠르게 가져올 수 있고, conatainsKey 메서드를 사용해 key의 중복값을 처리할 수 있기 때문이다.
https://www.acmicpc.net/problem/18870
'Algorithm > Baekjoon Oline Judge - Java' 카테고리의 다른 글
[백준] 11050_이항계수1 (0) | 2024.06.23 |
---|---|
[백준] 17103_골드바흐 파티션 / 에라토스테네스의 체 알고리즘 (1) | 2024.06.08 |
[백준] 10989_수정렬하기3 / 카운팅 정렬 (0) | 2024.06.08 |
[백준] 4134_다음 소수 (1) | 2024.06.08 |
[백준] 10814_나이순정렬 (0) | 2024.06.01 |