백준 18870번 풀이

문제

입력받은 수직선상의 좌표를 압축한 값을 출력하시오(라는데 이해가 안된다…)

Reference

https://eunhee-programming.tistory.com/116

https://only-wanna.tistory.com/entry/%EB%B0%B1%EC%A4%80-18870%EB%B2%88-%EC%A2%8C%ED%91%9C-%EC%95%95%EC%B6%95

풀이

뇌에서 블루스크린이 오긴 했는데… 아무튼… 이게 그래서 뭐 하는 문제냐면요… 엑셀의 rank()함수같은거다… 좌표를 오름차순으로 정렬한 다음 크기가 작은 순서대로 0, 1, 2, 3 이런 식으로 하면 된다. 아무튼 그럼.

import sys

N = int(sys.stdin.readline())
num_list = list(map(int, sys.stdin.readline().split()))
num_list2 = []

일단 나중에 출력하려면 원래 배열을 남겨둬야 한다. 무슨 말인지는 이따 설명해드림. 아무튼 그래서 num_list는 입력받은 리스트고, num_list2는 입력받은 리스트에서 중복값을 쳐내고 오름차순으로 정렬할거다.

num_list2 = set(num_list)
num_list2 = sorted(list(num_list2))

그러면 중복값을 쳐내고 정렬하고

rank_dic = {num_list2[i]:i for i in range(len(num_list2))}

일단 이거는 리스트 콤프리헨션인데… 중복값을 쳐내고 정렬한다고 했는데, 그러면 예시에 있는 1000 999 1000 999 1000 999의 경우 최종적으로 999, 1000이 된다. 그러면 이 리스트의 0번은 999니까 999(키)-0(밸류)쌍 하나, 1000(키)-1(밸류)쌍 하나 이렇게 나오게 된다. 어? 딕셔너리? 그럼 원 리스트를 남겨둔 건 그것때문이었나요??? 네, 그렇습니다.

for i in num_list:
    print(rank_dic[i],end=" ")

딕셔너리는 키로 픽하면 밸류가 나오는 구조이기때문에, 원래 리스트의 요소들을 위에서 만든 딕셔너리로 검색해 밸류를 뽑아내면 된다. 1000 999 1000 999 1000 999면 1000을 키로 픽하고, 999를 픽하고, 이런 식으로 반복하게 된다.

import sys

N = int(sys.stdin.readline())
num_list = list(map(int, sys.stdin.readline().split()))
num_list2 = []
num_list2 = set(num_list)
num_list2 = sorted(list(num_list2))

rank_dic = {num_list2[i]:i for i in range(len(num_list2))}

for i in num_list:
    print(rank_dic[i],end=" ")

아무튼 그렇다. 뇌정지 어유…