[백준] 18870번 좌표 압축 | 파이썬 Python

문제

수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다.

Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표 Xj의 개수와 같아야 한다.

X1, X2, ..., XN에 좌표 압축을 적용한 결과 X'1, X'2, ..., X'N를 출력해보자.

 

입력

첫째 줄에 N이 주어진다.

둘째 줄에는 공백 한 칸으로 구분된 X1, X2, ..., XN이 주어진다.

 

출력

첫째 줄에 X'1, X'2, ..., X'N을 공백 한 칸으로 구분해서 출력한다.

 

예제

 

나의 풀이1

import sys
input = sys.stdin.readline

N = int(input())
x_list = list(map(int, input().split()))
set_list = sorted(set(x_list))

for i in x_list:
    print(set_list.index(i), end=" ")
  • 입력값 그대로의 리스트 `x_list`와 입력값에서 중복값을 제거하고 오름차순으로 정렬한 리스트 `set_list`를 따로 생성한다.
  • for문을 실행해서 `set_list`에서 `x_list` 각 요소의 인덱스 값을 찾아서 출력한다.
  • 하지만 이 풀이는 시간초과로 실패했다.
  • 최대 `1,000,000`을 길이로 가질 수 있는 리스트에 for문으로 `index()`를 실행하는 게 시간 실행 시간을 증가시켰다.

 

다른 사람의 풀이

import sys
input = sys.stdin.readline

N = int(input())
x_list = list(map(int, input().split()))

set_list = sorted(set(x_list))
dic = {set_list[i] : i for i in range(len(set_list))}

for i in x_list:
    print(dic[i], end=" ")
  • `{-10: 0, -9: 1, 2: 2, 4: 3}`와 같이 `set_list`의 요소를 키로, 인덱스를 값으로 가지는 딕셔너리를 생성한다.
  • for문에서 딕셔너리의 인덱스로 접근하는 방식으로 값을 출력해서 시간 초과 문제를 해결했다.
  • `list.index(i)` 형태의 시간 복잡도 = O(N)
  • `index[i]` 형태의 시간 복잡도 = O(1)

 

참고