18870번: 좌표 압축

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

www.acmicpc.net

시간 제한

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 = ' ')

 

 

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

문제 출처 : www.acmicpc.net/problem/18870 Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다. X1, X2, ..., XN에 좌" data-og-host="www.acmicpc.net" data-og-source-url="https://www.acmicpc.net/problem/..

gudwns1243.tistory.com