[BOJ] #18879번: 좌표 압축
2022. 6. 18. 12:29ㆍ0️⃣ Algorithm&자료구조/BOJ
문제
수직선 위에 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을 공백 한 칸으로 구분해서 출력한다.
제한
- 1 ≤ N ≤ 1,000,000
- -109 ≤ Xi ≤ 109
예제 입력 1
5
2 4 -10 4 -9
예제 출력 1
2 3 0 3 1
풀이
pypy로 제출했다.
좌표 압축에 있어 하나하나 비교해보면서 압축하는 것은 시간복잡도를 기하급수적으로 늘리는 지름길이다.
주어진 수들을 먼저 정렬한 후, 그 순서를 출력하도록 하는 것이 효율적이다.
(1) 퀵정렬을 통해 리스트를 정렬했다.
(2) 중복되는 값은 set()을 통해서 제거했다.
(3) dictionary로 좌표 압축 값을 저장했고, 바로 불러올 수 있도록 했다.
* 리스트.index() 함수는 시간 복잡도 n^2를 가질 수 있으므로 자제해야겠다.
import sys
n = int(sys.stdin.readline())
n_list = list(map(int, sys.stdin.readline().split()))
def quicksort(array):
if len(array) <= 1:
return array
pivot = array[-1]
less, more, equal = [], [], []
for each in range(len(array)):
each = array.pop()
if each < pivot:
less.append(each)
elif each > pivot:
more.append(each)
else:
equal.append(each)
return quicksort(less) + equal + quicksort(more)
quick_list = quicksort(list(set(n_list.copy())))
i = 0
dic = {}
for q in quick_list:
dic[q] = i
i += 1
for n in n_list:
print(dic[n], end=' ')
'0️⃣ Algorithm&자료구조 > BOJ' 카테고리의 다른 글
[BOJ] #1920번: 수 찾기 (0) | 2022.06.22 |
---|---|
[BOJ] #2108번: 통계학 (0) | 2022.06.21 |
[BOJ] #1912번: 연속합 (0) | 2022.05.26 |
[BOJ] #9461번: 파도반 수열 (0) | 2022.05.26 |
[BOJ] #10986번: 나머지 합 (0) | 2022.05.21 |