1 분 소요

[Silver II] 좌표 압축 - 18870

문제 링크

성능 요약

메모리: 155280 KB, 시간: 1648 ms

분류

값 / 좌표 압축, 정렬

제출 일자

2024년 4월 1일 13:29:11

문제 설명

수직선 위에 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을 공백 한 칸으로 구분해서 출력한다.

풀이

# 시간초과 난 나의 풀이

import sys
input = sys.stdin.readline

N = int(input())
num = list(map(int, input().split()))
arr = num
arr = list(set(arr))
arr.sort()

for i in num:
    sys.stdout.write("%d "%arr.index(i))

정답률이 그리 높지 않아서 이런 식의 접근으로는 무조건 시간초과가 뜰 거라는 걸 예상했다. for문에서 .index 매서드로 값을 탐색할 때, 시간복잡도가 O(N)이 걸린다고 한다. 즉 N의 범위가 1,000,000까지니까 최대 1,000,000번 반복이 이루어지니 시간초과는 당연한 수순인 것이다. 따라서 시간복잡도를 줄이기 위해서는 dictionery를 사용할 수 있다. dictionery는 시간복잡도가 O(1)이므로 더 빠른 탐색속도를 자랑한다. 아래는 수정한 코드이다.

전체 코드

import sys
input = sys.stdin.readline

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

''' 입력받은 리스트 원소들의 중복을 없애고, 
    다시 리스트로 지정한 후 정렬'''
arr = sorted(list(set(num)))

''' key에 정렬되어있는 수들이 위치하고
    value에 인덱스(키값보다 작은 값의 개수)
    값이 위치한다.'''
dic = {arr[i] : i for i in range(len(arr))} # ex) { 10: 0, -9: 1, 2: 2, 3: 4 }

for i in num:
    sys.stdout.write("%d "% dic[i])

댓글남기기