알고리즘

백준 18870 자바

은세고화 2022. 3. 9. 18:58
반응형

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

 

18870번: 좌표 압축

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

www.acmicpc.net

 

접근 방식

못풀었다. 나보다 값이 작다면 +1을 하고 중복값을 제거하는 아이디어는 떠올렸다. 중복값 제거하니 Set이 떠올랐고 순위를 저장해서 조회하려면 Map이 필요해서 Set안에 Map을 사용해야하나?? 이런 생각만 든 채로 답을 봤다.

 

잘한 부분

순위를 매기고 중복을 제거하고 map을 찾은 부분은 잘 접근했다.

 

부족한 부분

확신이 부족했다. Set안에 Map을 넣으면 키값이 중복제거되고 거기서 2중for문을 다시 돌려야하나?? 이런 생각만 든 채로 실행해보지 않았다. 실행했어도 시간초과가 낫겠지만 아이디어가 떠올랐음에도 코드를 수행시키지 않은 것은 잘못된 부분이다.

 

그리고 StringBuilder를 사용하지 않으면 시간초과가 난다.

 

package backjon;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;

public class Main {

	static int N;
	static int[] arr;

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		N = Integer.parseInt(br.readLine());
		arr = new int[N];
		int[] result = new int[N];
		StringTokenizer st = new StringTokenizer(br.readLine());
		for (int i = 0; i < N; i++) {
			int s = Integer.parseInt(st.nextToken());
			arr[i] = result[i] = s;
			
		}
		Arrays.sort(arr);
		
		Map<Integer, Integer> map = new HashMap<Integer, Integer>();
		
		int index = 0;
		for (int i = 0; i < N; i++) {
			if(!map.containsKey(arr[i])) map.put(arr[i], index++);
		}
		
		for (int i = 0; i < N; i++) {
			sb.append(map.get(result[i]) + " ");
		}
		
		System.out.println(sb);
		
	}
	
}
반응형