티스토리 뷰

https://www.acmicpc.net/problem/18870

 

18870번: 좌표 압축

수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표 Xj의 개수와 같아야 한다. X1, X2, ..., XN에

www.acmicpc.net


1. 접근 방식

  • 중복되는 수가 존재하며, 중복되는 여러 수는 마치 하나만 존재하듯이 카운팅 되므로 집합 개념을 사용하자.
  • 중복 제거된 데이터를 정렬하면, 각 수의 인덱스가 곧 새로운 좌표이다. (파란색 숫자)
  • 각 수의 인덱스를 기억하기 위해 딕셔너리를 사용하자. key는 수이고, value는 인덱스이다.
  • 이후엔 기존 데이터를 순회하면서 해당 수를 딕셔너리 키로 갖는 value, 즉 인덱스를 출력한다.

 

 

2. 정답 코드

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

compressed = {x: i for i, x in enumerate(sorted(set(data)))}
results = [str(compressed[xn]) for xn in data]
print(' '.join(results))

 

 

3. 새로 알게 된 내용

  • 리스트 내 원소를 하나씩 출력할 때 반복문과 printf( ) 조합 대신 join( ) 메서드가 더욱 빠르다.
728x90