[Java] 백준 18870번

박세윤·2022년 7월 27일
0

BaekJoon Online Judge

목록 보기
82/95
post-thumbnail

백준 18870번

좌표 압축

문제

수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다.

Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다.

X1, X2, ..., XN에 좌표 압축을 적용한 결과 X'1, X'2, ..., X'N를 출력해보자.

입력

첫째 줄에 N이 주어진다.

둘째 줄에는 공백 한 칸으로 구분된 X1, X2, ..., XN이 주어진다.

출력

첫째 줄에 X'1, X'2, ..., X'N을 공백 한 칸으로 구분해서 출력한다.

예제

알고리즘 분류

  • 좌표
  • 값 / 좌표 압축

코드

import java.util.*;
import java.io.*;

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

풀이

좌표 압축 유형의 문제이다. 이번 문제는 1차원 좌표에서 필요없는 공간을 줄이기 위해 좌표를 압축시키고 순위를 제공하는 문제이다.

HashMap을 사용하는데, map은 key와 value값을 사용한다. 이 두가지 요소에 실제 값과 순위 값, 두 값을 매칭시키기 편해서 사용한다.
이번 문제를 해결하면서 hashmap의 여러 메소드들, containsKey(), get(), put() 등에 대해 다시 한번 기억하고 배우는 계기가 됬다.

profile
개발 공부!

0개의 댓글

관련 채용 정보