Algorithm/Baekjoon

[백준 18870 Python] 좌표 압축 - ItisFuture

Codexx 2022. 9. 11. 22:29

 

내가 쓴 정답 코드

n = int(input())
n_list = list(map(int,input().split()))
n_dic = {i:0 for i in n_list}
n_sorted_list = sorted(n_list)
cnt = 0
prev = n_sorted_list[0]
for i in n_sorted_list:
    if i == prev:
        n_dic[i] = cnt
    else:
        cnt+=1
        n_dic[i] = cnt
    prev = i
    
for idx,i in enumerate(n_list):
    n_list[idx] = n_dic[i]
print(*n_list)

풀이 아이디어

1. 제일 작은 숫자가 0 임을 파악

2. 오름차순으로 +1씩

    2-1. 주어진 값에 대하는 순서를 딕셔너리에 업데이트

3. 숫자 리스트에 각 숫자를 순서로 대체

 

여담

이 풀이와 대부분의 풀이에서 1초 내외의 시간이 경과됐다.

예전에 검색을 해봤지만 정확히 기억이 안 나서 파이썬은 1초에 몇 번을 계산하는지 궁금해져서 검색해보니 

2천만 번이라 하여 내 코드에서 어느 정도의 계산을 했나 궁금했다.

sorted()는 병합 정렬을 기반으로 만들어졌고 시간 복잡도는 O(NlogN)이다.

N번 반복하는 코드들은 4번 쓰여졌다.

문제에서 최대 백만 개의 데이터가 올 수 있다는 점을 생각하면

내 코드에서 최대 연산 횟수는 약 천만번이다.

따라서 1초라는 결과에 납득을 했다.

sorted()함수에 key값 활용하여 유용하게 써먹어야겠다.

https://devmath.tistory.com/23

 

[파이썬 Python] 정렬 라이브러리 / sorted() , sort() , key 값

sorted() 파이썬은 기본 정렬 라이브러리인 sorted() 함수를 제공한다. sorted() 는 병합 정렬을 기반으로 만들어졌는데, 병합 정렬은 일반적으로 퀵 정렬보다 느리지만 최악의 경우에도 시간 복잡도 O(

devmath.tistory.com