알고리즘/BOJ

[BOJ] 18870. 좌표 압축

재담 2022. 3. 19. 22:04

문제 원본 : https://www.acmicpc.net/problem/18870

 

18870번: 좌표 압축

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

www.acmicpc.net

import java.io.*;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;

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());
        X[] x = new X[n];
        X[] ans = new X[n];

        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i = 0; i < n; ++i) {
            x[i] = new X(Integer.parseInt(st.nextToken()), i);
        }

        Arrays.sort(x, Comparator.comparingInt(o -> o.value));

        ans[0] = new X(0, x[0].index);
        for (int i = 1; i < n; ++i) {
            if (x[i].value == x[i - 1].value) {
                ans[i] = new X(ans[i - 1].value, x[i].index);
            } else {
                ans[i] = new X(ans[i - 1].value + 1, x[i].index);
            }
        }

        Arrays.sort(ans, Comparator.comparingInt(o -> o.index));

        StringBuilder builder = new StringBuilder();
        for(X x1: ans) {
            builder.append(x1.value).append(" ");
        }

        bw.write(builder.toString());

        bw.close();
        br.close();
    }

    public static class X {
        public int value;
        public int index;

        public X(int value, int index) {
            this.value = value;
            this.index = index;
        }
    }
}
  • 정렬 문제
  • 값과 인덱스를 쌍으로 정렬하면 풀리는 문제이다.

'알고리즘 > BOJ' 카테고리의 다른 글

[BOJ] 1271. 엄청난 부자2  (0) 2022.03.21
[BOJ] 1744. 수 묶기  (0) 2022.03.20
[BOJ] 11049. 행렬 곱셈 순서  (0) 2022.03.18
[BOJ] 2629. 양팔저울  (0) 2022.03.17
[BOJ] 1655. 가운데를 말해요  (0) 2022.03.16