새벽을 밝히는 붉은 달

[Python] 백준 18870번: set, sorted, dict 활용 본문

Online Judge

[Python] 백준 18870번: set, sorted, dict 활용

자윰 2022. 1. 24. 21:51

📎 백준 18870번 풀러 가기!

 

18870번: 좌표 압축

수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다. X1, X2, ..., XN에 좌

www.acmicpc.net

문제

수직선 위에 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

오늘은 정렬 문제다!

 

파이썬은 정렬 함수를 제공하기 때문에 정렬이 필요한 경우 해당 기능을 이용하는 것이 좋다!

왜냐하면 내부적으로 저수준 언어를 사용하여 팀소트로 구현되어 있기 때문

 

처음에는 정렬 후 파이썬 리스트의 index 기능을 사용해서 풀었는데,

이렇게 하면 시간복잡도가 O(N)이 나와서 시간 초과가 떴다.

 

따라서 O(1) 시간만에 위치를 알아낼 수 있도록 dictionary를 사용하였다.

이때, enumerate를 사용하여 정렬된 숫자의 값과 index를 동시에 받아올 수 있도록 하였다.

 

예전에는 파이썬을 할 때 여러 기능들을 많이 찾아봤었는데,

이제 점차 찾아보지 않아도 사용할 수 있는 것들이 늘어나는 것 같아 뿌듯하다.

더 많이 찾아보고, 내부 구현에 대해 알아보고, 익숙해져야겠다!


아래는 내가 구현한 코드👇

import sys

N = int(sys.stdin.readline())

line = list(map(int, sys.stdin.readline().split()))
sort_list = sorted(set(line))
dic = {y : x for x, y in enumerate(sort_list)}

for i in line:
    print(dic[i], end= ' ')

print()
Comments