728x90

20240324 백준 파이썬 공부
18879번 좌표 압축

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

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

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

4. 제한
1 ≤ N ≤ 1,000,000
-10^9 ≤ Xi ≤ 10^9

>>> 코드 1. 좌표 정렬하고, 딕셔너리에 저장

n = int(input()) # 좌표의 개수 입력받기
axis = list(map(int, input().split())) # 좌표 입력
copy = sorted(axis) # 입력받은 좌표를 오름차순으로 정렬한 복사본 만들기
check = {} # 각각의 좌표를 대체할 값을 저장할 딕셔너리
s = 0 # 대체 좌표값
for i in copy:
    if i not in check: # 만약 딕셔너리에 없으면 저장
        check[i] = s
        s += 1
for i in range(n): # 딕셔너리 값으로 기존 값 대체
    axis[i] = check[axis[i]]
print(*axis) # 출력



>>> 코드2. 중복 없애고, 정렬하고, 딕셔너리에 저장

n = int(input()) # 좌표의 개수 입력받기
axis = list(map(int, input().split())) # 좌표 입력
copy = sorted(set(axis)) # 입력받은 좌표를 중복을 없애고 오름차순으로 정렬한 복사본 만들기
check = {} # 각각의 좌표를 대체할 값을 저장할 딕셔너리
s = 0 # 대체 좌표값
for i in copy:
    check[i] = s
    s += 1
for i in range(n): # 딕셔너리 값으로 기존 값 대체
    axis[i] = check[axis[i]]
print(*axis) # 출력

 

 

둘다 성공했으나, 두번째 코드가 미세하게 더 빠르다.

>>>문제링크
https://www.acmicpc.net/problem/18870

728x90

+ Recent posts