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

 

18870번: 좌표 압축

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

www.acmicpc.net

코드설명

좌표압축 문제입니다.

HashMap을 활용하여서 이미 좌표의 순위가 결정된 경우 더이상 처리하지 않도록 했습니다.

출력할때는 원래의 배열의 순서대로 출력해야하기에, copy 배열을 선언하여 오름차순으로 정렬한뒤 진행합니다.

 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;


public class Main {
	
	public static int N;
	public static int[] arr;
	public static int[] copy;
	public static HashMap<Integer, Integer> hashmap = new HashMap<>();
    public static void main(String[] args) throws IOException{
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	
    	StringTokenizer st = new StringTokenizer(br.readLine());
    	N = Integer.parseInt(st.nextToken());
    	arr = new int[N];
    	copy = new int[N];
    	st = new StringTokenizer(br.readLine());
    	for(int i=0;i<N;i++) {
    		arr[i] = Integer.parseInt(st.nextToken());
    		copy[i] = arr[i];
    		
    	}
    
    	Arrays.sort(copy);
    	
    	int rank = 0;
    	for(int i=0;i<copy.length;i++) {
    		if(!hashmap.containsKey(copy[i])) {
    			hashmap.put(copy[i], rank);
    			rank++;
    		}
    	}
    	
    	StringBuilder sb = new StringBuilder();
    	for(int value: arr) {
    		sb.append(hashmap.get(value)).append(' ');
    	}
    	System.out.println(sb.toString());
    }
}

 

Arrays.copyOfRange 함수를 활용하여 얕은복사를 진행한 코드입니다.

package Main;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;
import java.util.StringTokenizer;
 
public class Main {
	static int N, M, S, P, K, A, B, X;
	static int answer = 0;
	static int[] arr;
	static StringBuilder sb = new StringBuilder();
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		N = Integer.parseInt(st.nextToken());
		arr = new int[N];
		st = new StringTokenizer(br.readLine());
		for(int i=0;i<N;i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		}
		
		int[] sortedArr = Arrays.copyOfRange(arr, 0, arr.length);
		Arrays.sort(sortedArr);
		HashMap<Integer, Integer> hashmap = new HashMap<Integer, Integer>();
		for(int i=0, rank = 0;i<N;i++) {
			if(!hashmap.containsKey(sortedArr[i])) {
				hashmap.put(sortedArr[i], rank++);
			}
		}
		for(int i=0;i<N; i++) {
			sb.append(hashmap.get(arr[i]) + " ");
		}
		System.out.println(sb);
	}
}

+ Recent posts