Algorithm/Baekjoon

[백준_18870/JAVA] 좌표 압축

guineaa 2025. 2. 27. 14:13

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

 

문제 풀이

문제만 보고 어떤것을 요구하는지 파악하기가 힘들었다.

이 문제는 그냥 원소를 크기 순서대로 정렬 후 순위를 매기는 것이라 보면 된다.

 

원본 배열 입력 받기 -> 원본 배열 정렬 

-> HashMap으로 정렬된 배열에 우선 순위 ranking

(정렬된 배열을 순회하면서 중복된 숫자는 무시하고 최초 등장하는 숫자에만 Rank를 부여해줌,

Key에는 정렬된 배열 값, Value에는 Rank를 저장해야 원본 배열을 Key로 Hashmap에서 값을 찾아서 출력해줄 수 있기 때문)

-> 원본 배열 순서 대로 rank 출력

 

코드

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));
    	StringTokenizer st;
    	
    	int N=Integer.parseInt(br.readLine());
    	
    	int arr[]=new int[N];
    	int sortedArr[]=new int[N];
    	
    	HashMap<Integer, Integer> pressed=new HashMap<Integer, Integer>();
    	
    	st=new StringTokenizer(br.readLine());
    	for(int i=0;i<N;i++) {
    		arr[i]=sortedArr[i]=Integer.parseInt(st.nextToken());
    	}
    	
    	Arrays.sort(sortedArr);
    	
    	// 배열 압축
    	int rank=0;
    	for(int val: sortedArr) {
    		if(!pressed.containsKey(val)) {
    			pressed.put(val, rank);
    			rank++;
    		}
    	}
    	
    	// 원본 배열 기준으로 출력하기
    	StringBuilder sb=new StringBuilder();
    	for(int val: arr) {
    		sb.append(pressed.get(val)).append(" ");
    	}
    	
    	bw.write(sb.toString());
    	bw.flush(); bw.close();
    }
    
}

참고 블로그

https://kadosholy.tistory.com/120

 

[Java] 자바 - HashMap 사용방법 (개념, 특징, 메소드 및 예제)

자바 - HashMap 사용방법 (개념, 특징, 메소드 및 예제) 컬렉션의 하나로 데이터를 키(Key)와 밸류(Value)의 짝으로 저장하는 HashMap에 대해서 알아보도록 하겠습니다. 목차 HashMap이란? HashMap 생성방법 Ha

kadosholy.tistory.com

https://kkungchan.tistory.com/302

 

문제 번호 18870번 : 좌표 압축 - JAVA [자바]

https://www.acmicpc.net/problem/18870 18870번: 좌표 압축 수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다

kkungchan.tistory.com