[백준] 18870번 좌표 압축 Java 문제 풀이

2023. 2. 17. 12:09알고리즘/백준

728x90
반응형

문제풀이

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;

interface Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st;

        int N = Integer.parseInt(br.readLine());
        AtomicInteger idx = new AtomicInteger();
        String[] arr = br.readLine().split(" ");
        Map<Integer, Integer> map = Arrays.stream(arr).mapToInt(Integer::parseInt).boxed().sorted().distinct().collect(Collectors.toMap(s->s, s->idx.getAndIncrement(), (s1, s2)->s1,LinkedHashMap::new));

        for(int i=0; i<arr.length; i++) {
            sb.append(map.get(Integer.parseInt(arr[i])) + " ");
        }
        System.out.println(sb);
    }
}

가장 작은 값이 0이고 그다음 수는 1, 2, ... 이렇게 하면 되는 문제입니다.

 

둘째 줄에 입력받은 수를 배열로 받아서 map으로 변환했습니다.

key는 입력받은 숫자, value는 AtomicInteger 이란 걸 사용했는데 더 가벼운 게 있을 거 같은데 검색하다가 이걸로 구현해 봤습니다.

정렬과 중복제거를 한 다음, LinkedHashMap으로 받기 때문에 입력 순서가 보장되어 idx.getAndIncrement()를 하게 되면 0, 1, 2, ... 이렇게 값이 들어갑니다.

 

아까 입력받은 배열 값이 map의 key에 해당하므로 배열을 순회하며 출력하면 끝입니다.

 

 

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

 

18870번: 좌표 압축

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

www.acmicpc.net

 

728x90
반응형