image

Silver Ⅱ 🔗18870. 좌표 압축

📝문제 요약

문제

수직선 위에 N개의 좌표 X₁, X₂, …, Xₙ이 있다. 이 좌표에 좌표 압축을 적용하려고 한다.

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

X₁, X₂, …, Xₙ에 좌표 압축을 적용한 결과 X’₁, X’₂, …, X’ₙ를 출력해보자.

입력

첫째 줄에 N이 주어진다.

둘째 줄에는 공백 한 칸으로 구분된 X₁, X₂, …, Xₙ이 주어진다.

출력

첫째 줄에 X’₁, X’₂, …, X’ₙ을 공백 한 칸으로 구분해서 출력한다.

제한

  • 1 ≤ N ≤ 1,000,000
  • -10 ⁹≤ Xᵢ ≤ 10⁹


✏️문제 풀이

  • 입력
    • 좌표의 개수 n을 입력
    • n개의 좌표를 공백으로 구분하여 입력받아 리트스 x에 저장
  • set()을 사용하여 x의 중복을 제거하고 오름차순 정렬
  • 딕셔너리 컴프리헨션을 사용
    • 각 좌표값 : 키
    • 그 좌표의 인덱스 : 값
  • 원래 입력받은 좌표 순서대로 각 좌표의 압축된 순위를 출력

코드와 함께 보는 풀이

# 좌표의 개수 n을 입력
n = int(input())
# n개의 좌표를 공백으로 구분하여 입력받아 리트스 x에 저장
x = list(map(int, input().split()))

# set()을 사용하여 x의 중복을 제거하고 오름차순 정렬
x_sort = sorted(set(x))

# 각 좌표값 : 키, 그 좌표의 인덱스 : 값 으로 하여 딕셔너리로 저장
x_dict = {x_sort[i]: i for i in range(len(x_sort))}

# 원래 입력받은 좌표 순서대로 각 좌표의 압축된 순위를 출력
for i in x:
    print(x_dict[i], end=' ')


💯제출 코드

n = int(input())
x = list(map(int, input().split()))

x_sort = sorted(set(x))

x_dict = {x_sort[i]: i for i in range(len(x_sort))}

for i in x:
    print(x_dict[i], end=' ')

댓글남기기