본문 바로가기
백준알고리즘/정렬

(Python/🥈2)백준 알고리즘 18870번: 좌표 압축

by windy7271 2022. 5. 25.
728x90
반응형

문제 출처:https://www.acmicpc.net/problem/18870

 

18870번: 좌표 압축

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

www.acmicpc.net

풀이:

sys import

n = int(input())
arr = list(map(int, input().split()))
arr_list = sorted(list(set(arr)))       # 중복제거
arr_dic = {}

for i in range(len(arr_list)):          # arr_list 에 길이만큼 포문을 돌려
    arr_dic[arr_list[i]] = i            # 딕셔너리를 만들어준다
for i in range(n):                      # 입력받은 n 만큼 포문을 돌려
    arr[i] = arr_dic[arr[i]]            # 딕셔너리에서 키에 arr[i]를 넣어 벨류를 찾아 arr를 만들어줌
print(*arr)
# * 는 언팩킹 [] 까줌
# for i in range(n):
#     print(arr[i], end = ' ')   print(*arr) 대신 가능

한 카테고리의 마지막 문제답게 좀 어려웠다.

 

이 문제는 좌표압축 즉 각 숫자들의 순위를 0부터 출력하면된다

 

예를들어 1,10,100,1000 이면 0,1,2,3 이렇게 압출할 수 있다.

 

딕셔너리를 사용한 이유는 

일반적은 for 문을 돌려 index를 찾아 프린트 하는것은 빅오가 O(n) 이라 시간초과로 실패한다 

딕셔너리의 빅오는 O(1) 이다.

 

이 문제를 통해 딕셔너리에 대해 한번 보고 갔으면 좋겠다.

반응형

댓글