barcode

백준 18870번 풀이

BOJ/[BOJ] Python

문제

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

 

18870번: 좌표 압축

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

www.acmicpc.net

입력받은 수직선상의 좌표를 압축한 값을 출력하시오(라는데 이해가 안된다...)

 

Reference

https://eunhee-programming.tistory.com/116

 

코딩테스트 준비 - 백준18870번 좌표압축 풀이:파이썬 딕셔너리 활용 (파이썬)

백준 18870번 풀이 문제풀러가기 https://www.acmicpc.net/problem/18870 Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다. X1, X2, ..., XN에 좌" data-og-host="www.acmicpc.net" data-og-source-url="https..

eunhee-programming.tistory.com

https://only-wanna.tistory.com/entry/%EB%B0%B1%EC%A4%80-18870%EB%B2%88-%EC%A2%8C%ED%91%9C-%EC%95%95%EC%B6%95

 

[파이썬] 백준 18870번 좌표 압축

Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다. X1, X2, ..., XN에 좌" data-og-host="www.acmicpc.net" data-og-source-url="https://www.acmicpc.net/problem/18870" data-og-url="https://www.acmicpc.ne..

only-wanna.tistory.com

 

풀이

뇌에서 블루스크린이 오긴 했는데... 아무튼... 이게 그래서 뭐 하는 문제냐면요... 엑셀의 rank()함수같은거다... 좌표를 오름차순으로 정렬한 다음 크기가 작은 순서대로 0, 1, 2, 3 이런 식으로 하면 된다. 아무튼 그럼.

 

import sys

N = int(sys.stdin.readline())
num_list = list(map(int, sys.stdin.readline().split()))
num_list2 = []

일단 나중에 출력하려면 원래 배열을 남겨둬야 한다. 무슨 말인지는 이따 설명해드림. 아무튼 그래서 num_list는 입력받은 리스트고, num_list2는 입력받은 리스트에서 중복값을 쳐내고 오름차순으로 정렬할거다.

 

num_list2 = set(num_list)
num_list2 = sorted(list(num_list2))

그러면 중복값을 쳐내고 정렬하고

 

rank_dic = {num_list2[i]:i for i in range(len(num_list2))}

일단 이거는 리스트 콤프리헨션인데... 중복값을 쳐내고 정렬한다고 했는데, 그러면 예시에 있는 1000 999 1000 999 1000 999의 경우 최종적으로 999, 1000이 된다. 그러면 이 리스트의 0번은 999니까 999(키)-0(밸류)쌍 하나, 1000(키)-1(밸류)쌍 하나 이렇게 나오게 된다. 어? 딕셔너리? 그럼 원 리스트를 남겨둔 건 그것때문이었나요??? 네, 그렇습니다.

 

for i in num_list:
    print(rank_dic[i],end=" ")

딕셔너리는 키로 픽하면 밸류가 나오는 구조이기때문에, 원래 리스트의 요소들을 위에서 만든 딕셔너리로 검색해 밸류를 뽑아내면 된다. 1000 999 1000 999 1000 999면 1000을 키로 픽하고, 999를 픽하고, 이런 식으로 반복하게 된다.

 

import sys

N = int(sys.stdin.readline())
num_list = list(map(int, sys.stdin.readline().split()))
num_list2 = []
num_list2 = set(num_list)
num_list2 = sorted(list(num_list2))

rank_dic = {num_list2[i]:i for i in range(len(num_list2))}

for i in num_list:
    print(rank_dic[i],end=" ")

아무튼 그렇다. 뇌정지 어유...

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 10815번 풀이  (0) 2022.10.12
백준 1620번 풀이  (0) 2022.09.30
백준 10814번 풀이  (0) 2022.09.29
백준 1181번 풀이  (0) 2022.09.29
백준 11650, 11651번 풀이  (0) 2022.09.19