최대 1 분 소요

백준 (BOJ) 18870번
https://www.acmicpc.net/problem/18870

사용언어 : PYTHON

1.문제

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

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

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

즉 [2,10,15,1,1] 라는 데이터가 있으면 값의 대소관계만 고려한 데이터로 변환하라는 것이다.
(위 예시의 정답 : [1,2,3,0,0])

2.풀이

각 원소의 중복을 제거하고 정렬 한 다음, 각 값에 0부터 순서를 부여하면 된다.
처음에는 index함수를 사용하여 위치를 출력하였는데, 이렇게하면 모든 원소에 대해서(N) index를 수행(O(N))하여 최종적으로 O(N**2)의 시간복잡도가 걸리게 되어 시간초과가 나왔다.
이를 해결하기 위해 dictionary에서 자신의 위치를 할당하여 바로 출력(=O(1)의 시간복잡도)하게 하였다.

3-1.시간초과 코드

import sys
input = sys.stdin.readline

_=int(input())
l=list(map(int,input().split()))

l_component=list(set(l))
l_component.sort()

for i in l:
    print(l_component.index(i),end=' ')  # O(n**2)의 시간복잡도

3-2.정답코드

import sys
input = sys.stdin.readline

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

l_component=sorted(list(set(l)))

l_dict={l_component[i]:i for i in range(len(l_component))}

for i in l:
    print(l_dict[i]) # O(N)의 시간복잡도

댓글남기기