[Python] 백준 18870번: 좌표 압축

민정·2023년 3월 26일

백준 풀이

목록 보기
5/17

풀이 전략은 다음과 같습니다.

N개의 숫자를 순서가 바뀌지 않게 0, 1, 2, ... 와 같은 수로 대체해주면 되는데요!

압축 전의 숫자를 key로, 압축 후의 숫자를(0, 1, 2, ... ) value로 가지는 dictionary를 정의해서 매칭되는 숫자의 쌍을 정의해주고,
이후 dictionary에 저장된 쌍에 맞게 숫자를 대체해주면 됩니다.

풀이 단계는 다음과 같습니다.

  1. set을 이용하여 압축 전 숫자 리스트의 중복을 제거해줍니다.
  2. set을 정렬해줍니다.
  3. 정렬된 set의 값을 key로, set의 인덱스를 value로 가지는 dictionary를 선언합니다.
  4. 압축 전 숫자 리스트를 순회하며, 압축 전 숫자를 key로 가지는 value를 출력해줍니다.

출력하는 방법을 보시면

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로 놓을지 잘 결정한다면 빠르게 문제를 풀어갈 수 있습니다.

0개의 댓글