시간 제한
2초
메모리 제한
512MB
문제
수직선 위에 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
예제 입력 1
5
2 4 -10 4 -9
예제 출력 1
2 3 0 3 1
예제 입력 2
6
1000 999 1000 999 1000 999
예제 출력 2
1 0 1 0 1 0
나의 풀이
메모리 제한이 512MB로 여유로워서 순서를 따로 저장할 dict 생성 후 순서 출력
- 문제 풀이엔 좋은 접근이지만 왜 메모리 제한을 많이 줬는지 고민해볼 필요
- 메모리 제한이 많음 -> 순서를 따로 저장(Hash)해두지 않으면 시간 초과 발생할 것이라고 유추 가능
- 순서만 비교할 것이기 때문에 num_list를 sort하기 전에 set으로 중복 값을 없앴다면 더 간단하게 해결 가능
import sys
n = int(input())
num_list = sys.stdin.readline().rstrip().split()
num_list = list(map(int, num_list))
rank = 0
mean_num = min(num_list)
num_rank = {}
for i in sorted(num_list):
if i > mean_num:
mean_num = i
rank += 1
num_rank[i] = rank
print(*[num_rank[i] for i in num_list])
다른 사람 풀이
시간 초과 발생 풀이
$O(n)$으로 index를 접근하는 과정에서 시간 초과 발생
- sort로 중복 값을 없애 index가 곧 순서가 됨
import sys
input = sys.stdin.readline
n = int(input())
arr = list(map(int, input().split()))
arr2 = sorted(list(set(arr)))
for i in arr:
print(arr2.index(i), end = ' ')
성공 풀이
dict을 구성해 $O(1)$의 시간 복잡도로 문제 해결
import sys
input = sys.stdin.readline
n = int(input())
arr = list(map(int, input().split()))
arr2 = sorted(list(set(arr)))
dic = {arr2[i] : i for i in range(len(arr2))}
for i in arr:
print(dic[i], end = ' ')