출처:
https://www.acmicpc.net/problem/18870
18870번: 좌표 압축
수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다. X1, X2, ..., XN에 좌
www.acmicpc.net
풀이
import sys
n = int(sys.stdin.readline())
a = list(map(int, sys.stdin.readline().split()))
uni = list(sorted(set(a)))
dic = {b : index for index, b in enumerate(uni)}
for i in a:
print(dic[i], end = ' ')
딕셔너리가 너무 약하다...
입출력은 생략한다.
문제를 보면 정렬을 단순히 하면 될 것 같지만
단순히 정렬을 해서 똑같은 등수를 처리하기는 곤란하다. 따라서 딕셔너리를 떠올려서 풀어야한다.
예제 2를 예로 들자
1000 999 1000 999 1000 999
를 set 하면 중복이 모두 빠진다
따라서 (1000, 999) 가 된다.
그 다음 이걸 sorted() 해주면 (999,1000)이 된다. 그리고 list를 하면 우리가 원하는 [999,1000] 형태가 나온다.
이제 딕셔너리를 쓸거다.
enumerate는 인덱스의 번호를 주기 위한 함수이다.
따라서 {b: index for index, b in enumerate(uni)} 이렇게 한다는 뜻은
[999,1000] 에서 index 는 0 ,1 b는 999 1000 을 가져와서 999: 0 1000:1 로 지정하라는 소리다.
그래서 최종적 코드를 뜯어보면
[1000,999,1000,999,1000,999] 에서 i가 1000이면 dic[1000] 즉 1 , 999이면 dic[999]=0 이렇게 출력된다.
'코딩테스트' 카테고리의 다른 글
백준 15651 N과 M(3) - python (0) | 2022.02.03 |
---|---|
15650 N과 M(2) (0) | 2022.02.02 |
백준 10814 나이순 정렬 (0) | 2022.01.17 |
백준 2108 통계학 (0) | 2022.01.16 |
백준 1436 영화감독 슘 (0) | 2022.01.15 |