https://www.acmicpc.net/problem/18870
18870번: 좌표 압축
수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표 Xj의 개수와 같아야 한다. X1, X2, ..., XN에
www.acmicpc.net
import java.io.*;
import java.util.*;
public class Main
{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
String[] input = br.readLine().split(" ");
Set<Integer> hashset = new HashSet();
HashMap<Integer,Integer> hashmap = new HashMap();
for(String s: input){
hashset.add(Integer.valueOf(s));
}
Integer[] sortedInput= new Integer[hashset.size()];
int index=0;
for(Integer s: hashset){
sortedInput[index++] = s;
}
bw.write(hashset.toString());
Arrays.sort(sortedInput);
for(int i=0;i<sortedInput.length;i++){
hashmap.put(sortedInput[i],i);
}
for(int i=0; i<n-1;i++){
bw.write(hashmap.get(Integer.parseInt(input[i]))+" ");
}
bw.write(hashmap.get(Integer.parseInt(input[n-1]))+"");
bw.flush();
}
}
해시셋이 아닌 트리셋을 이용하면 정렬된 셋을 얻을 수 있다.
import java.io.*;
import java.util.*;
class Main
{
public static void main (String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
String[] inputs = br.readLine().split(" ");
int[] xs = new int[N];
Set<Integer> setX = new TreeSet<>();
for (int i = 0; i < N; i++) {
xs[i] = Integer.parseInt(inputs[i]);
setX.add(xs[i]);
}
Map<Integer, Integer> sortedIndex = new HashMap<>();
int idx = 0;
for (int x : setX)
sortedIndex.put(x, idx++);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
for (int i = 0; i < N; i++)
bw.write(sortedIndex.get(xs[i]) + " ");
bw.flush();
}
}
'Problem Solving > 정렬' 카테고리의 다른 글
BOJ1931 회의실 배정(R) 대표문제 (1) | 2024.02.06 |
---|---|
BOJ2910 빈도 정렬 (0) | 2024.02.06 |
BOJ1302 베스트셀러 (0) | 2024.02.06 |
BOJ 7785 회사에 있는 사람 (1) | 2024.02.06 |
BOJ10814 나이순 정렬 (0) | 2024.02.05 |
https://www.acmicpc.net/problem/18870
18870번: 좌표 압축
수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표 Xj의 개수와 같아야 한다. X1, X2, ..., XN에
www.acmicpc.net
import java.io.*;
import java.util.*;
public class Main
{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
String[] input = br.readLine().split(" ");
Set<Integer> hashset = new HashSet();
HashMap<Integer,Integer> hashmap = new HashMap();
for(String s: input){
hashset.add(Integer.valueOf(s));
}
Integer[] sortedInput= new Integer[hashset.size()];
int index=0;
for(Integer s: hashset){
sortedInput[index++] = s;
}
bw.write(hashset.toString());
Arrays.sort(sortedInput);
for(int i=0;i<sortedInput.length;i++){
hashmap.put(sortedInput[i],i);
}
for(int i=0; i<n-1;i++){
bw.write(hashmap.get(Integer.parseInt(input[i]))+" ");
}
bw.write(hashmap.get(Integer.parseInt(input[n-1]))+"");
bw.flush();
}
}
해시셋이 아닌 트리셋을 이용하면 정렬된 셋을 얻을 수 있다.
import java.io.*;
import java.util.*;
class Main
{
public static void main (String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
String[] inputs = br.readLine().split(" ");
int[] xs = new int[N];
Set<Integer> setX = new TreeSet<>();
for (int i = 0; i < N; i++) {
xs[i] = Integer.parseInt(inputs[i]);
setX.add(xs[i]);
}
Map<Integer, Integer> sortedIndex = new HashMap<>();
int idx = 0;
for (int x : setX)
sortedIndex.put(x, idx++);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
for (int i = 0; i < N; i++)
bw.write(sortedIndex.get(xs[i]) + " ");
bw.flush();
}
}
'Problem Solving > 정렬' 카테고리의 다른 글
BOJ1931 회의실 배정(R) 대표문제 (1) | 2024.02.06 |
---|---|
BOJ2910 빈도 정렬 (0) | 2024.02.06 |
BOJ1302 베스트셀러 (0) | 2024.02.06 |
BOJ 7785 회사에 있는 사람 (1) | 2024.02.06 |
BOJ10814 나이순 정렬 (0) | 2024.02.05 |