본문 바로가기
알고리즘 풀이/백준

[백준 18870] 좌표 압축(Java)

by char_lie 2023. 6. 8.
반응형

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

 

18870번: 좌표 압축

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

www.acmicpc.net

좌표 압축 문제

좌표 압축을 적용한 결과를 출력하는 문제

 

사용 알고리즘

# 정렬

📌문제 접근 포인트

1. 좌표 압축의 개념에 대해서 먼저 생각해보자. 좌표 압축은 쉽게 생각하면 중복을 제거하여 오름차순 정렬 후, 해당 순서 인덱스 값을 가져오란 뜻이다.
예를 들어 예제를 좌표 압축을 적용하면
2 4 -10 4 -9를 생각해보면 중복을 제거해서 오름차순 정렬하면 -10 -9 2 4를 얻을 수 있다.
여기서 -10, -9, 2, 4에 각각 해당하는 인덱스 0, 1, 2, 3을 기존의 값에 대입하면 2, 3, 0, 3, 1을 얻을 수 있다.
2. 해당 문제를 해결하기 위해 배열을 선언해서 순서대로 집어 넣은 후, 해당 배열의 복사본을 남겨두자. 그러고 원본을 오름차순 정렬하여 HashMap을 이용해 순서대로 넣어주면서 중복을 제거하자.
3. 복사한 배열과 HashMap의 값을 비교해서 출력하면 성공

⚙ 내가 푼 정답 코드

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));
        int N = Integer.parseInt(br.readLine());
        int count = 0;
        StringTokenizer st = new StringTokenizer(br.readLine()," ");
        int[] nums = new int[N];
        for (int i = 0; i < N; i++) {
        	nums[i] = Integer.parseInt(st.nextToken()); 
        }
        int[] origin = nums.clone();
        Arrays.sort(nums);
        StringBuilder sb = new StringBuilder();
        HashMap<Integer, Integer> x = new HashMap<>();
        for (int i = 0; i< N; i++) {
        	if (!x.containsKey(nums[i])) {
        		x.put(nums[i], count++);
        	}
        }
        for (int i = 0; i < N; i++) {
        	sb.append(x.get(origin[i])).append(" ");
        }
        System.out.println(sb);
    }
}
반응형

'알고리즘 풀이 > 백준' 카테고리의 다른 글

[백준 1735] 분수합 (Java)  (0) 2023.06.14
[백준 1967] 트리의 지름(python)  (0) 2023.06.14
[백준 9084] 동전 (python)  (0) 2023.06.08
[백준 1463] 1로 만들기 (python)  (0) 2023.06.05
[백준 9251] LCS (python)  (0) 2023.06.03

댓글