백준 18870: 좌표 압축

Hapjeong Girl·2023년 4월 20일
0

BACKJOON

목록 보기
22/22
post-thumbnail

[Silver II] 좌표 압축 - 18870

문제 링크

성능 요약

메모리: 154288 KB, 시간: 2832 ms

분류

값 / 좌표 압축(coordinate_compression), 정렬(sorting)

문제 설명

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



문제 풀이

아이디어

이분 탐색을 활용하자

처음에 깡구현으로 풀었다가 시간초과가 나서 이분 탐색으로 변경했다.
이분탐색을 활용하여 중복이 제거되고 정렬된 sorted_x_list에서 bisect_left()를 돌리면 된다.

처음에 집합을 써서 중복을 제거해도 되는지 싶었는데, 문제에서 서로 다른 좌표의 개수라고 했기에 중복을 제거해야 하는게 맞다.

코드

import sys
from bisect import bisect_left

input = sys.stdin.readline

n = int(input())
x_list = list(map(int, input().split()))
sorted_x_list = sorted(list(set(x_list)))

for x in x_list:
  print(bisect_left(sorted_x_list, x), end=" ")
profile
프론트엔드 / 컴퓨터공학과 4학년

0개의 댓글