728x90
반응형
단계별로 풀어보기 - [정렬] - 18870번 좌표 압축
문제
문제링크
풀이
x좌표 리스트를 받고, 순서대로 정렬한 다음, 그 순위를 출력해주면 된다.
처음 리스트를 정렬해서 그 인덱스 값을 출력하는 풀이를 생각했다.
유의할 점은,
✅ 같은 좌표는 같은 순위를 가지므로 압축된 좌표값도 동일하다.
그냥 정렬된 리스트의 인덱스 값을 출력하면 같은 좌표값도 순위가 다르게 나오기 때문에,
정렬된 좌표들은 set으로 표현하여 중복을 제거해줘야 한다.
✅ 시간 복잡도 고려
일단 input()함수보다 sys.stdin.realine 함수가 더 빨라서, 시간 제한이 있는 경우 후자를 선택하는 것이 좋다.
그리고 단순히 처음 입력받은 좌표 리스트의 좌표값을 순서대로 정렬된 리스트에서 찾아서 그 인덱스 값을 출력하도록 하였더니 시간 초과가 떴다.
아무래도 이중 반복문을 썼으니,,ㅎ
시간 초과가 났던 풀이
n = int(input())
x_list = [int(x) for x in input().split()]
sorted_list = sorted(set(x_list))
for x in x_list:
for i in range(len(sorted_list)):
if x == sorted_list[i]:
print(i, end=' ')
그래서 dictionary 자료형을 이용하여 좌표값을 통해 해당 인덱스 값을 바로 가져올 수 있도록 구현하였다.
{dic[요소]: 요소의 인덱스} 의 형태로 저장함으로써 dic[x]로 값을 뽑을 때 O(1)이 되도록 하였다.
참고로 list.index(i)로도 리스트에서 요소의 인덱스 값을 바로 뽑을 수 있는데, 이럴 경우 시간 복잡도는 O(n)이다.
그러나 index[i] 형태는 시간 복잡도가 O(1)로, 더 빠르다.
CODE
import sys
input = sys.stdin.readline
n = int(input())
x_list = [int(x) for x in input().split()]
sorted_list = sorted(set(x_list))
dic = {sorted_list[i]: i for i in range(len(sorted_list))}
for x in x_list:
print(dic[x], end=' ')
결과
728x90
반응형