수직선 위에 N
개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다.
Xi를 좌표 압축한 결과 X'i의 값은 Xi > 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
6
1000 999 1000 999 1000 999
1 0 1 0 1 0
-문제를 만든 사람: baekjoon
import java.io.*;
import java.util.*;
import java.util.stream.Stream;
class Pair{
int index;
int value;
public Pair(int index, int value){
this.index=index;
this.value=value;
}
}
public class Code18870 {
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
int N=Integer.valueOf(br.readLine());
String nums=br.readLine();
int[] dot= Stream.of(nums.split(" ")).mapToInt(Integer::parseInt).toArray();
br.close();
int prior=0;
int priorvalue=0;
List numbers=new ArrayList();
for(int i=0;i<N;i++){
numbers.add(new Pair(i,dot[i]));
}
Collections.sort(numbers, new Comparator() {
public int compare(Object o1,Object o2){
return (((Pair)o1).value) - (((Pair)o2).value);
}
});
int rank=0;
int priorrank=0;
for(Object pair: numbers){
Integer temp=(((Pair)pair).value);//-10
((Pair) pair).value=rank;
if(rank!=0 && prior==temp){ // -10 -9 2 4 4
// rank=rank-1;
((Pair) pair).value=priorrank;
}
else{
rank++;
}
priorrank=((Pair) pair).value;
prior=temp;
}
Collections.sort(numbers, new Comparator() {
public int compare(Object o1,Object o2){
return (((Pair)o1).index) - (((Pair)o2).index);
}
});
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
int plus=0;
for(Object pair: numbers){
String answer=String.valueOf(((Pair) pair).value);
if(plus+1==N){
bw.write(answer);
}
else{
bw.write(answer+" ");
}
plus++;
}
bw.flush();
bw.close();
}
}
5
1 1 3 1 1
언니가 알려준 반례이다.
rank=rank-1
얘가 문제였다.
얘를 지우고 나니까 해결됐다!! (12번이나 시도했다.. 시간초과때문에..)
그리고 원래 이중for문을 사용했었는데, 시간초과가 났었다. 그래서
class
함수를 주고 그 함수를 정렬하는 식으로 했다.
C++에 있는 페어가 Java에는 없어서 이렇게 했다.
위의 링크를 참조해서 해결했다 ㅠㅠ 정렬하는 방법도 알게되고 출력하는 방법도 배웠다.
정렬도 해결했다!!!!