18870번: 좌표 압축

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

www.acmicpc.net

수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다.

Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다.

X1, X2, ..., XN에 좌표 압축을 적용한 결과 X'1, X'2, ..., X'N를 출력해보자.

입력

첫째 줄에 N이 주어진다.

둘째 줄에는 공백 한 칸으로 구분된 X1, X2, ..., XN이 주어진다.

출력

첫째 줄에 X'1, X'2, ..., X'N을 공백 한 칸으로 구분해서 출력한다.

제한

  • 1 ≤ N ≤ 1,000,000
  • -109 ≤ Xi ≤ 109

예제 입력 1 복사

5
2 4 -10 4 -9

예제 출력 1 복사

2 3 0 3 1

예제 입력 2 복사

6
1000 999 1000 999 1000 999

예제 출력 2 복사

1 0 1 0 1 0

 

문제풀이

문제는... 잘 이해가 안가서 입력 출력값으로 분석했다

그냥 해당 숫자 리스트에 중복을 따지지 않고, 숫자 순위를 매기는 문제인거같다.

 

문제해결

중복된 숫자의 순서는 어짜피 같으므로 set()을 이용해서 중복된 숫자 제거 리스트 생성

중복 숫자 없는 리스트 정렬

정렬한 리스트를 딕셔너리에 저장 {숫자값 : 정렬된 순서}

딕셔너리를 통해서 오리진 숫자에 순서 부여

import sys

n = int(input())

num_list = list(map(int, sys.stdin.readline().rstrip().split()))
dic_num = {}
result_list = []

num_set = set(num_list)             #중복제거
none_overlap = list(num_set)        #중복 제거된 숫자 리스트 생성
none_overlap.sort()                 #중복 제거된 리스트 정렬하기

for i in range(len(none_overlap)) :
    dic_num[none_overlap[i]] = i    #딕셔너리에 {숫자 값 : 정렬된 순서} 저장                  

for i in range(len(num_list)) :             #딕셔너리에 숫자에 대한 정렬된 순서 저장되어 있으니
    print(dic_num[num_list[i]], end=" ")    #num_list에 맞게 출력
[백준 | 파이썬] 18870번: 좌표 압축(딕셔너리)