메모리: 154288 KB, 시간: 2832 ms
값 / 좌표 압축(coordinate_compression), 정렬(sorting)
수직선 위에 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을 공백 한 칸으로 구분해서 출력한다.
이분 탐색을 활용하자
처음에 깡구현으로 풀었다가 시간초과가 나서 이분 탐색으로 변경했다.
이분탐색을 활용하여 중복이 제거되고 정렬된 sorted_x_list에서 bisect_left()를 돌리면 된다.
처음에 집합을 써서 중복을 제거해도 되는지 싶었는데, 문제에서 서로 다른 좌표의 개수
라고 했기에 중복을 제거해야 하는게 맞다.
import sys
from bisect import bisect_left
input = sys.stdin.readline
n = int(input())
x_list = list(map(int, input().split()))
sorted_x_list = sorted(list(set(x_list)))
for x in x_list:
print(bisect_left(sorted_x_list, x), end=" ")