백준 : [Silver II] 좌표 압축 - 18870

GitHub Link

문제 Link

문제 설명

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

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

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

입력

첫째 줄에 N이 주어진다.

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

출력

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

풀이 코드

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import sys

n = int(sys.stdin.readline())

x_list = list(map(int, sys.stdin.readline().split()))

# 중복을 제외한 후 리스트를 정렬시킨다.
sorted_x_list = sorted(set(x_list))
sorted_x_dict = {}
for i, x in enumerate(sorted_x_list):
    if x not in sorted_x_dict:
        sorted_x_dict[x] = i

zipped_x_list = [sorted_x_dict[x] for x in x_list]


print(" ".join(map(str, zipped_x_list)))

CHECK!

  • 출력 형식을 지키기 위해 " “.join 을 사용하는것이 중요

  • 중복을 제외하지 않았더니 같은 값이 존재하는 경우엔(1,1,0, 0) 결과가 제대로 나오지 않음

    1
    2
    3
    4
    5
    6
    7
    8
    
    4
    1 1 0 0
    
    # 예상 결과
    1 1 0 0
    
    # 실제 결과
    2 2 0 0
    
  • 그래서 set()을 통해 중복값을 없애고, 정렬한 리스트를 사용해 원하는 결과를 얻음

Hugo로 만듦
JimmyStack 테마 사용 중