코딩테스트

백준 18870 좌표 압축 - python

math_tbro 2022. 1. 17. 23:34

출처:

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