https://school.programmers.co.kr/learn/courses/30/lessons/42584
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제
주식이 떨어 지기 전까지 기간이 몇초인지 리턴하는 문제이다.
입력
- prices의 각 가격은 1 이상 10,000 이하인 자연수입니다.
- prices의 길이는 2 이상 100,000 이하입니다.
출력
주식이 떨어 지기 전까지 기간이 몇초인지 리턴하라.
풀이
모든 가격을 돌때마다 시간을 0으로 푸시 해준다. 그리고 다음 가격과 비교하여 가장 높은 가격은 바로 이전 가격부터 아래로 하나하나 비교한다.
비교했을때 이전 가격이 더 크다면 하락 한것이므로 스택에 들어간 이전 가격을 빼주고 마찬가지로 푸시했던 시간 0에 이전까지 더했던 시간리스트 값을 넣어준다.
def solution(prices):
answer = [] # 정답
stack = [] # 스택
cntlis = [] # 각 가격 마다의 시간
stack.append(prices[0]) # 처음 가격 을 스택에 푸시
cntlis.append(0) # 처음 가격의 시간 0
answer.append(0) # 처음 답
for price in prices[1:]: # 처음 가격 정보 빼고 나머지 정보를 돈다.
for i in range(len(cntlis)): # 모든 가격의 시간을 1씩 더해준다.
cntlis[i] += 1
cnt = 1 # 인덱스를 위한 cnt
while len(stack) > 0 and price < stack[-1]: # 스택의 마지막이 현재 가격보다 크다면 스택의 길이가 0보다 클때까지 돈다.
stack.pop() # 스택을 팝한다.
while answer[-cnt] != 0: # answer 의 뒤에서부터 인덱싱하며 answer 의 값이 0이나올때까지 cnt 를 더해준다.
cnt += 1
answer[-cnt] = cntlis.pop() # answer 의 값이 0일때 cntlis 의 값을 빼서 넣어준다.
cntlis.append(0) # 현재가격의 시간을 0으로 둔다.
stack.append(price) # 현재 가격을 스택에 넣어준다.
answer.append(0) # 현재가격의 답을 0으로 둔다.
idx = len(prices) - 1 #prices 의 길이만큼 idx로 만든다.
while len(cntlis) != 0: # 가격의 시간을 저장한 함수가 0이될때까지 돈다.
if answer[idx] == 0: # answer 가 0이면
answer[idx] = cntlis.pop() # 해당 가격에 시간을 넣어준다.
idx -= 1
return answer # 답리턴
'알고리즘' 카테고리의 다른 글
프로그래머스/124 나라의 숫자/py (0) | 2022.08.26 |
---|---|
프로그래머스/오픈채팅방/py (0) | 2022.08.25 |
프로그래머스/위장/py (0) | 2022.08.24 |
프로그래머스/전화번호 목록/py (0) | 2022.08.23 |
백준/가장 가까운 세 사람의 심리적 거리/py (0) | 2022.08.22 |