본문 바로가기
Problem Solving/CodeUp

[CodeUp][Python]3018번 풀이

by NoiB 2021. 11. 22.
반응형

오늘은 3018번 풀이를 진행해보겠습니다. 많이 어렵진 않은데요. 아무래도 특정 원소를 기준으로 정렬하는 구현이 생소하실지도 모르겠습니다. 천천히 진행해봅시다.

 

문제 링크 : https://codeup.kr/problem.php?id=3018 

 

쿨식스

비합리적인 수치가 가장 낮은 편의점의 종류, 거리, 가격을 출력한다. (만약 비합리적인 수치가 같으면 오징어는 지쳐있으니 가장 가까운 곳을 출력하도록 한다.)

codeup.kr

코드 : 

import sys

def counting_sort(store_list : list, price_list : list):
    cnt = [0 for i in range(1,100001)]
    for i in price_list:
        cnt[i] += 1
    for i in range(len(cnt)-1):
        cnt[i+1] += cnt[i]
    for i in range(len(price_list)):
        store_list[i].append(store_list[i][1]+cnt[price_list[i]])
    return store_list

n = int(sys.stdin.readline())
store_list = []
price_list = []
for i in range(n):
    num,distance,price = map(int, sys.stdin.readline().split())
    store_list.append([num,distance,price])
    price_list.append(price)
store_list = counting_sort(store_list, price_list)
unreasonable_list = sorted(store_list, key=lambda x : (x[3], x[1]))
answer = f'{unreasonable_list[0][0]} {unreasonable_list[0][1]} {unreasonable_list[0][2]}'
print(answer)
#O(n)

어째 최근에 계속 정렬 문제만 풀다보니 이번에도 counting sort를 사용해봤는데요. 음수가 나오거나 범위는 큰데 데이터 갯수가 작은게 아니라면 상당히 쓸만합니다. 시간복잡도가 O(n)으로 상당히 빠르다는 것도 한 몫 하죠. 참고로 정렬 알고리즘을 써야 하는 이유는 비합리성이 '거리 + 가격'이 아닌 '거리 순위 + 가격 순위'라서 그렇습니다.

 

저 같은 경우는 정렬 알고리즘을 이용해서 아예 거리와 가격 순위를 더한 데이터를 미리 추가한 다음 해당 데이터로 오름차순 정렬을 먼저 하고 거리에 따른 오름차순 정렬을 한 번 더 진행했습니다. 직접 구현을 하게되면 분명히 힘들겠지만 저렇게 기능을 지원하니 상당히 편하게 코드를 짤 수 있었습니다. 답의 출력은 f-string법으로 출력하면 슬라이싱을 이용한다거나 print(,end = '  ') 등의 구현을 할 필요없으니 보다 깔끔하게 짤 수 있겠죠?

 

문제 자체는 그렇게 어렵지 않습니다만 어떻게 하면 쉽게 구현할까에 대한 고민은 좀 많이 했던 문제였습니다. 제 코드가 꼭 정답은 아니니 본인만의 방법으로 풀어보시고 이렇게 푸는 사람도 있구나 하고 생각하시면 될 것 같습니다.

반응형

'Problem Solving > CodeUp' 카테고리의 다른 글

[CodeUp][Python]3015번 풀이  (0) 2021.11.23
[CodeUp][Python]3004번 풀이  (0) 2021.11.19
[CodeUp][Python]1805 풀이  (0) 2021.11.18
[CodeUp][Python]코드업 기초100제(끝) 6091~6098  (0) 2021.11.13