Algorithm/JAVA - BOJ

BOJ/백준 - 18870 좌표 압축 JAVA

ㅇㅇ잉 2021. 9. 26. 01:39

https://www.acmicpc.net/problem/18870

 

18870번: 좌표 압축

수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다. X1, X2, ..., XN에 좌

www.acmicpc.net

 

 

문제 이해를 잘못해서 머리 박박 긁었던 문제

 

그니까, 배열을 오름차순으로 정렬해서 자기보다 작은 수가 몇개 있는지 알아보면 된다.

주의할 점은 출력할 때 입력받은 순서를 지킬 것!

 

설명은 주석에

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
 
        //중복 방지 위해
        Map<Integer, Integer> map = new HashMap<>();
 
        int N = Integer.parseInt(br.readLine());
        int[] arr = new int[N];
        
        //정렬하기 위함. 입력받은 순으로 출력해야해서 배열 따로 생성
        int[] tmp = new int[N]; 
 
        StringTokenizer st = new StringTokenizer(br.readLine());
        for(int i=0;i<N;i++){
            int n = Integer.parseInt(st.nextToken());
            arr[i]=n;
            tmp[i]=n;
        }
        
        //오름차순 정렬
        Arrays.sort(tmp);
 
        int cnt=0;
 
        for (int i = 0; i < tmp.length; i++) {
            //정렬된 tmp 배열 보면서 확인
            //아래코드 == if(map.get(tmp[i])==null) : map에 tmp[i]값이 없으면
            if(!map.containsKey(tmp[i])) {
                //map에 push해줌
                map.put(tmp[i], cnt++);
            }
        }
 
        for(int i=0;i<N;i++){
            sb.append(map.get(arr[i]) + " ");
        }
        System.out.println(sb);
    }
}
cs