99클럽 코테 스터디 22일차 TIL + sorted(), set(), enumerate(), 딕셔너리 컴프리헨션

임정민·2025년 2월 24일
0
post-thumbnail

1. 문제

[문제 설명]

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

[제한]

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

[입출력 예]

2. 풀이

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)))

3. 회고

3-1. 문제 해결 과정

숫자를 입력 받는 것까지는 좋지만 예제 입력 2처럼 중복된 값이 있는 경우를 주의해야 한다. set()을 이용해서 중복을 제거하고 좌표 압축에 맞게 sorted()를 이용하여 요소들을 오름차순으로 정렬한다.

그리고는 enumerate()를 이용해서 좌표에 대한 값과 인덱스를 부여한다. 마지막으로 압축된 값만 남기기 위해 [coord_map[x] for x in coords]와 같이 작성하면 압축된 좌표만 반환한다.

3-2. 새롭게 배운 내용

  • 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)
profile
Data Science and Natural Language Processing

0개의 댓글

관련 채용 정보