(Silver2) 백준 18870 좌표압축(Python)

Adrian·2023년 3월 14일
0

PS

목록 보기
21/25
post-thumbnail

문제링크

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

문제

수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다.

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

X1, X2, ..., XN에 좌표 압축을 적용한 결과 X'1, X'2, ..., X'N를 출력해보자.

입력

첫째 줄에 N이 주어진다.

둘째 줄에는 공백 한 칸으로 구분된 X1, X2, ..., XN이 주어진다.

출력

첫째 줄에 X'1, X'2, ..., X'N을 공백 한 칸으로 구분해서 출력한다.

제한

1 ≤ N ≤ 1,000,000
-109 ≤ Xi ≤ 109

예제 입력 1
5
2 4 -10 4 -9

예제 출력 1
2 3 0 3 1

예제 입력 2
6
1000 999 1000 999 1000 999

예제 출력 2
1 0 1 0 1 0

풀이 과정

  • 문제와 예제 출력을 보면 중복을 고려하지 않고, 자신보다 작은 원소가 몇개 있는지만 출력하면 된다. 따라서 먼저 입력 리스트를set으로 중복을 제거한 후, 다시 리스트로 만들어 정렬한다.
  • 중복되는 원소가 없고 리스트가 오름차순으로 정렬돼있으므로, 리스트 내 원소의 인덱스는 곧 자신보다 작은 원소의 갯수가 된다.
  • 따라서 반복문을 돌려 arr2의 인덱스를 arr1에 할당하면 된다....라고 했지만 이렇게하면 O(N)의 시간복잡도로 시간초과가 난다.
  • 따라서 dict 자료형을 이용해서 O(1)의 시간 복잡도로 풀어야하는 문제이다.

정답 코드

import sys
N = int(sys.stdin.readline())
arr = list(map(int,sys.stdin.readline().split()))
arr2 = list(sorted(set(arr)))

dic = {arr2[i]:i for i in range (len(arr2))}

for i in arr:
  print(dic[i],end=' ')
profile
관조, 사유, 끈기

0개의 댓글