18870번: 좌표 압축 (acmicpc.net)

초기 문제 접근

  • 일단 문제 이해부터가 어려워서 질문 게시판을 찾아보니,그냥 이 배열 중 자기보다 낮은 원소의 개수를 출력하는 것 이었음
  • 근데 최대 N이 1,000,000 이니까 이중 for 문 쓰면 무조건 터질 것 같음
  • 정렬하고 하나하나 비교하나..?
  • 조금 찾아보니 이진 탐색을 사용하면 된다고 나와있음

GPT의 문제 접근

  • 하지만 단순히 Map 사용으로 문제를 해결할 수 있었음
  • 각 순위를 표시할 rank = 0을 선언함
  • 정렬한 배열을 첫 번째 인덱스부터 순회함
  • Map 안에 현재 순회하는 값이 없다면 새로 삽입 후 rank++
  • 결과적으로 숫자 별로 순위가 Map에 저장이 됨

코드

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

public class Main {

	static int N;

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

}