QA & Engineering Blog

A Blog about Quality · Automation · Engineering

🏠 홈으로

[Silver II] 좌표 압축 - 18870

문제 링크

성능 요약

메모리: 159320 KB, 시간: 1612 ms

분류

정렬, 값 / 좌표 압축

제출 일자

2025년 6월 25일 18:34:11

문제 설명

수직선 위에 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을 공백 한 칸으로 구분해서 출력한다.

💡 Solutions

📄 좌표 압축.py

import sys
input = sys.stdin.readline

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

# 중복 제거 후 정렬
sorted_unique = sorted(set(num_list))

# 각 값에 대해 압축된 좌표를 딕셔너리에 저장
num_dict = {value: idx for idx, value in enumerate(sorted_unique)}

# 원래 리스트의 값들을 압축된 값으로 변환
rlt = [num_dict[num] for num in num_list]

print(*rlt)



####ㅇ 이전에 있던 병신같은 코드
import sys
input = sys.stdin.readline

n = int(input())
num_list = list(map(int, input().split()))
num_dict = dict()

for idx in range(n):
    key = num_list[idx]
    if key in num_dict:
        num_dict[key].append(idx)
    else:
        num_dict[key] = [idx]

rlt = [ 0 for _ in range(n)]

min_num = min(num_list)
max_num = max(num_list) 

num_list = list(set(sorted(num_list)))
num_list.sort()

# print(num_list)
# print(num_dict)

cnt = 0
for idx in range(len(num_list)):
    
    for i in num_dict[num_list[idx]]:
        rlt[i] = cnt
    
    cnt += 1
    
print(*rlt)