티스토리 뷰

알고리즘

백준 18870 - 파이썬

취뽀가자!! 2024. 2. 16. 23:17

https://www.acmicpc.net/problem/18870

 

18870번: 좌표 압축

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

www.acmicpc.net

문제 풀이

이번 문제는 설명을 이해하는데 좀 애먹었다. 좌표를 압축한다고는 하는데 입출력 예제를 봐도 이해가 안 돼서 해당 문제를 설명해 둔 글들을 보며 이해를 했다.

 

여기서 좌표를 압축한다는 내용 때문에 문제를 한번에 이해하기 어려워졌다고 생각하는데 이를 정리하면 다음과 같다.

 

좌표의 압축 = 해당 값보다 작은 값들의 개수로 대체

 

이 점만 알게 되면 사실 문제의 설명을 다 이해한 셈이고, 바로 코드로 구현하면 된다.

 

import sys
input = sys.stdin.readline

n = int(input())
arr = list(map(int,input().split()))
numArr = []
setArr = list(set(arr))
sortedList = sorted(setArr)

for i in range(len(setArr)):
    numArr.append(i)

numDict = {}
for i in range(len(sortedList)):
    numDict[sortedList[i]] = numArr[i]

for num in arr:
    print(numDict[num], end=" ")

 

 

여기서 가장 핵심으로 사용된 문법은 집합의 set과 딕셔너리이다. set을 통해 중복을 제거한 후 오름차순으로 정렬해 주면, 정렬된 첫 번째 값은 더 작은 값이 없기 때문에 해당 값의 인덱스를 numArr 리스트에 넣어준다. 이후 딕셔너리에 key와 value를 매칭시켜 주는데, 여기서 key는 처음 입력된 값들이고, value는 좌표를 압축한 값이다. 마지막으로 딕셔너리를 arr에 들어있는 순서에 맞게 출력해 주면 된다.

 

import sys
input = sys.stdin.readline

n = int(input())
arr = list(map(int, input().split()))

arr2 = sorted(list(set(arr)))
dic = {arr2[i]: i for i in range(len(arr2))}
for i in arr:
    print(dic[i], end=" ")

 

다음 코드는 구글링을 하면서 좀 더 간결하게 작성하려면 어떻게 해야 하나 찾아보다가 발견한 블로그의 코드이다.

풀이 방법은 똑같으나 파이썬의 문법을 더 잘 활용한 모습이다.

 

느낀점

문제를 이해하니 금방 풀 수 있었던 문제였다. 다만, 아쉬운 점은 코드의 간결함이 아쉽다. 생각을 노트에 작성 후 정리하지 않고 바로 코드로 작성하다 보니 더더 난잡해진 거 같다. 다음에는 코드로 생각과 어떻게 코드를 작성할지 대강이라도 정리한 후 구현을 해 봐야 되겠다.

'알고리즘' 카테고리의 다른 글

백준 1620 - 파이썬  (1) 2024.02.20
백준 10815 - 파이썬  (0) 2024.02.18
백준 1789 - 파이썬  (0) 2024.02.05
백준 2839 - 파이썬  (2) 2024.01.25
백준 1436 - 파이썬  (0) 2024.01.19
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함