[백준 문제풀이] 18870 - 좌표 압축

백준 문제풀이 18870번

풀이

실행속도를 높이기위해 sys.stdin.readline을 사용했는데 이상한 문제점이 생겼다.

1
2
3
4
5
6
7
8
9
10
import sys

input = sys.stdin.readline
print = sys.stdout.write

N = int(input())

arr = [0] * N
for i in range(N):
    arr[i] = list(map(int, input().split(" ")))

이렇게 코드를 짰을 때 다른 문제에서는 이상없이 동작했는데 띄어쓰기로 구분해 변수에 입력된 값을 저장하지않고 개행으로 변수에 값이 저장되어서, rstrip(), 메모리 할당을 하지 않고 arr.append()까지 사용했지만 결과가 똑같았다. 그래서 그냥 values 변수에 미리 저장해놓고 for 문을 돌려 값을 저장했다.

좌표 압축 테크닉은 ‘알고리즘 테크닉 - 좌표 압축이란?’ 에 따로 포스팅해놓았다. 처음에는 list를 사용해 문제를 풀려고했는데 코드가 더러워지는 느낌이 들었다. 그래서 인덱스를 활용할 수 있는 dict를 사용해 좌표 압축(중복된 값 제거 > 오름차순 정렬 > 인덱스로 원래 배열 바꾸기)을 진행했더니 코드가 깔끔해졌다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import sys

input = sys.stdin.readline
print = sys.stdout.write

N = int(input())
values = list(map(int, input().split()))

arr = [0] * N
for i in range(N):
    arr[i] = values[i]

setArr = list(set(arr))  # 중복된 값 제거
setArr.sort()  # 정렬
 
dictArr = {
    value: i for i, value in enumerate(setArr)
}  # 새로운 배열 setArr에 인덱스를 부여한 dictArr을 만듬

for value in arr:
    print("".join(str(dictArr.get(value))) + " ")

댓글남기기