
풀이 전략은 다음과 같습니다.
N개의 숫자를 순서가 바뀌지 않게 0, 1, 2, ... 와 같은 수로 대체해주면 되는데요!
압축 전의 숫자를 key로, 압축 후의 숫자를(0, 1, 2, ... ) value로 가지는 dictionary를 정의해서 매칭되는 숫자의 쌍을 정의해주고,
이후 dictionary에 저장된 쌍에 맞게 숫자를 대체해주면 됩니다.
풀이 단계는 다음과 같습니다.
출력하는 방법을 보시면
print(dic[l], end=" ")
end 값을 " "로 주어서 출력한 것을 볼 수 있습니다.
이 방법으로 출력해주면 출력 형식처럼 한줄로 간편하게 출력할 수 있습니다.
import sys
N = int(sys.stdin.readline())
inp = list(map(int, sys.stdin.readline().split())) # 압축 전 숫자 리스트
inp_set = sorted(set(inp)) # 중복 제거 후 정렬
dic = {inp_set[i]:i for i in range(len(inp_set))} # 압축 전-압축 후 dictionary
# 순회하며 압축 후 숫자를 출력
for l in inp:
print(dic[l], end=" ")
이처럼 0부터 시작하는 인덱스가 아닌 "압축 전 숫자"를 key로 하여 대체할 문자를 구해야하는 문제에서는 dictionary (맵 자료구조)를 사용하는 것이 좋습니다.
무엇을 key로, 무엇을 value로 놓을지 잘 결정한다면 빠르게 문제를 풀어갈 수 있습니다.