수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다.
Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표 Xj의 개수와 같아야 한다.
X1, X2, ..., XN에 좌표 압축을 적용한 결과 X'1, X'2, ..., X'N를 출력해보자.
첫째 줄에 N이 주어진다.
둘째 줄에는 공백 한 칸으로 구분된 X1, X2, ..., XN이 주어진다.
첫째 줄에 X'1, X'2, ..., X'N을 공백 한 칸으로 구분해서 출력한다.
import sys
N = int(input())
coords = list(map(int, sys.readline().split()))
# 중복을 제거한 후 정렬
sorted_unique = sorted(set(coords))
# 각 좌표의 압축된 값을 매핑
coord_map = {value: index for index, value in enumerate(sorted_unique)}
# 원래 배열을 압축된 값으로 변환
compressed_coords = [coord_map[x] for x in coords]
print(" ".join(map(str, compressed_coords)))
숫자를 입력 받는 것까지는 좋지만 예제 입력 2처럼 중복된 값이 있는 경우를 주의해야 한다. set()
을 이용해서 중복을 제거하고 좌표 압축에 맞게 sorted()
를 이용하여 요소들을 오름차순으로 정렬한다.
그리고는 enumerate()
를 이용해서 좌표에 대한 값과 인덱스를 부여한다. 마지막으로 압축된 값만 남기기 위해 [coord_map[x] for x in coords]
와 같이 작성하면 압축된 좌표만 반환한다.
sorted()
: 리스트 안의 요소들을 오름차순으로 정렬한다.
set()
: 리스트의 중복된 요소를 자동으로 제거한다.
enumerate()
: 리스트나 튜플 같은 반복 가능한 객체를 요소에서 하나씩 꺼내면서 동시에 인덱스도 제공하는 함수이다.
fruits = ["apple", "banana", "cherry"]
for index, value in enumerate(fruits):
print(index, value)
# 출력 결과
# 0 apple
# 1 banana
# 2 cherry
for
문을 사용하여 정석처럼 작성하면 다음과 같이 코드가 길어진다.numbers = [1, 2, 3, 4, 5]
squares = {}
for num in numbers:
squares[num] = num ** 2 # 키는 num, 값은 num의 제곱
print(squares)
하지만 딕셔너리 컴프리헨션을 이용하면 아래와 같이 코드를 간소화 할 수 있다. 출력 값은 동등하게 {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
이다.
numbers = [1, 2, 3, 4, 5]
squares = {num: num ** 2 for num in numbers}
print(squares)