새벽을 밝히는 붉은 달
[Python] 백준 18870번: set, sorted, dict 활용 본문
문제
수직선 위에 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()
'Online Judge' 카테고리의 다른 글
[Python] 백준 10816번: dict, counter 활용 (0) | 2022.01.26 |
---|---|
[Python] 백준 1991번: 트리 순회 구현 (1) | 2022.01.25 |
[Python] 백준 1966번: 큐 응용하기 (0) | 2022.01.23 |
[Python] 백준 15650번: 백트래킹 두 번째 (0) | 2022.01.22 |
[Python] 백준 2606번: DFS, BFS 구현 (0) | 2022.01.21 |
Comments