[Silver II] 좌표 압축 - 18870
성능 요약
메모리: 366240 KB, 시간: 2024 ms
분류
값 / 좌표 압축, 정렬
제출 일자
2024년 10월 23일 15:24:55
문제 설명
수직선 위에 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을 공백 한 칸으로 구분해서 출력한다.
예제 입력
5
2 4 -10 4 -9
예제 출력
2 3 0 3 1
좌표의 최솟값을 0으로 설정하고,
나머지 숫자들은 최솟값과의 차이를 계산해 1씩 증가시켜
좌표를 압축할 수 있다.
1. 주어진 배열을 오름차순으로 정렬한다.
2. Map에 기존 값과 압축된 좌표를 입력한다.
3. 기존 배열을 순회하며 압축된 좌표를 출력한다.
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws IOException {
StringBuilder sb = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
List<Integer> list = new ArrayList<>();
for(int i=0; i<N; i++) {
list.add(Integer.parseInt(st.nextToken()));
}
int[] sortedList = list.stream().distinct().sorted().mapToInt(i -> i).toArray();
Map<Integer, Integer> map = new HashMap<>();
int num = 0;
for (int i : sortedList) {
map.put(i, num);
num++;
}
for(int i : list){
sb.append(map.get(i));
sb.append(" ");
}
System.out.println(sb);
br.close();
}
}
'코딩테스트 > 백준' 카테고리의 다른 글
[Silver I] 쉬운 최단거리 - 14940 (1) | 2024.10.23 |
---|---|
[Silver I] 절댓값 힙 - 11286 (1) | 2024.10.23 |
[Gold V] AC - 5430 (1) | 2024.10.20 |
[Silver III] 1로 만들기 - 1463 (0) | 2024.10.18 |
[Gold V] 토마토 - 7576 (1) | 2024.10.17 |