https://school.programmers.co.kr/learn/courses/30/lessons/42584
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제설명
초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하는 것이다.
제한사항
prices의 길이는 2 이상 100,000 이하이다.
구현1
def solution(prices):
answer = []
temp = prices
while len(temp) > 0:
price = temp.pop(0)
count = 0
for item in temp:
count += 1
if price > item:
break
answer.append(count)
return answer
위와 같이 구현하였을 때 올바르게 리턴은 되지만 효율성 테스트 모두 실패하였다. 효율성 있는 코드를 구현하려면 시간복잡도 O(10^12)을 보통 넘기면 안된다.
위 문제에서 주어진 제한사항을 보면 시간복잡도에 관여되는 prices의 길이가 2이상 10^5이하로 O(n^2)을 풀게된다면 최악의 시간복잡도가 O(n^12)이기 때문에 효율성 테스트에서 간당간당하게 실패한 포인트를 찾아야한다.
따라서, 이를 개선해보겠다.
구현2
from collections import deque #deque 사용
def solution(prices):
answer = []
temp = deque(prices) #deque 사용
while len(temp) > 0:
price = temp.popleft() #deque 메소드 사용
count = 0
for item in temp:
count += 1
if price > item:
break
answer.append(count)
return answer
list의 pop(0)의 경우 복잡도가 O(n)으로 2중 반복문으로 구현하여 O(n^2)에서 O(n)연산이 추가되었기 때문에 효율성 테스트에서 실패했던 것이다.
이때, 활용하기 좋은 것이 파이썬에서 제공하는 deque이다. 이를 사용하시면 O(1)의 복잡도로 popleft() 왼쪽에서의 첫번째 원소를 뽑아올 수 있어 시간복잡도가 줄어든다.
아래의 wiki를 참고하자.
https://wiki.python.org/moin/TimeComplexity
TimeComplexity - Python Wiki
This page documents the time-complexity (aka "Big O" or "Big Oh") of various operations in current CPython. Other Python implementations (or older or still-under development versions of CPython) may have slightly different performance characteristics. Howe
wiki.python.org
'언어 > Python' 카테고리의 다른 글
[Leetcode] DFS/BFS - Number of Islands (2) | 2023.12.08 |
---|---|
[프로그래머스 알고리즘 Kit] 스택/큐 - 다리를 지나는 트럭 (0) | 2023.11.05 |
[Leetcode] 이중연결리스트 - Design Browser History (0) | 2023.10.26 |
이중연결리스트(Doubled Linked-List) 구현 (0) | 2023.10.24 |
[김왼손의 왼손코딩] 파이썬 기초강의(2) (0) | 2023.10.18 |
댓글