출처 : 백준 #18870
시간 제한 | 메모리 제한 |
---|---|
2초 | 512 MB |
수직선 위에 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
5
2 4 -10 4 -9
2 3 0 3 1
6
1000 999 1000 999 1000 999
1 0 1 0 1 0
list.index()
를 사용할 때 O(N)
의 시간이 소요되었고, 결국 시간초과가 나오게 되었다.O(1)
만 걸리도록 하였다.# 백준 18870번
from sys import stdin
def solution(n, arr):
answer = [0] * n
temp = []
for i in range(n):
temp.append((arr[i], i))
temp = sorted(temp, key = lambda x : x[0])
j = 0
for _ in range(n):
idx = temp[j]
if j > 0 and temp[j][0] == temp[j-1][0]:
answer[idx[1]] = answer[temp[j-1][1]] # 같은 값이 존재하면 answer의 이전 인덱스에 해당하는 값을 넣어준다.
temp.pop(j) # 그리고 해당 값을 뺀다.
else:
answer[idx[1]] = temp.index(idx)
j += 1
for k in range(n-1):
print(answer[k], end=" ")
print(answer[-1])
n = int(stdin.readline())
arr = list(map(int, stdin.readline().split()))
solution(n, arr)
# 백준 18870번
from sys import stdin
def solution(n, arr):
answer = [0] * n
temp = set()
for i in range(n):
temp.add(arr[i])
comparison = []
for t in temp:
comparison.append(t)
comparison = sorted(comparison)
dictionary = {}
for c in range(len(comparison)):
dictionary[comparison[c]] = c
for k in range(n):
answer[k] = dictionary[arr[k]]
for k in range(n-1):
print(answer[k], end=" ")
print(answer[-1])
n = int(stdin.readline())
arr = list(map(int, stdin.readline().split()))
solution(n, arr)