https://school.programmers.co.kr/learn/courses/30/lessons/42584#
문제 설명
초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요.
제한사항
prices의 각 가격은 1 이상 10,000 이하인 자연수입니다.
prices의 길이는 2 이상 100,000 이하입니다.
입출력 예
prices | return |
---|---|
[1, 2, 3, 2, 3] | [4, 3, 1, 1, 0] |
입출력 예 설명
def solution(prices):
res = []
for i in range(len(prices)-1):
cnt = 0
for j in range(i+1, len(prices)):
if prices[j] >= prices[i]:
cnt += 1
res.append(cnt)
return(res+[0])
문제는 스택/큐
이지만 완전탐색으로 풀 수 있을 것 같아 이중 반복문으로 시도함.
답이 없음
지금까지 문제가 지금 값보다 이상인 값을 있음 그만큼 개수 세라는 뜻인줄 알았는데 그게 아님
https://bada744.tistory.com/104
구글링하다 본 문제 해설 글을 참고하자.
이분 해석 안봤으면 계속 뭔뜻인지 몰랐을 것 같다. 내가 주식알못이라 그런가 지문이 이해하기 어렵다.
이중 반복문으로 처리하는 건 맞는데 시간 효율을 위해서 break
를 사용하면 됨.
def solution(prices):
res = [0]*len(prices)
for i in range(len(prices)-1):
for j in range(i+1, len(prices)):
res[i] += 1
if prices[j] < prices[i]:
break
return(res)
시간이 너무 길긴 한데..통과하면 된 거 아니냐
def solution(prices):
stack = []
answer = [0] * len(prices)
for i in range(len(prices)):
if stack != []:
while stack != [] and stack[-1][1] > prices[i]: #이전보다 가격이 떨어졌으면
past, _ = stack.pop() #바로 이전의 시점(인덱스) 꺼내기
answer[past] = i - past #떨어지지 않은 시간 저장
stack.append([i, prices[i]]) #현재 시점 저장
for i, s in stack: #가격이 떨어지지 않은 시점들의 시간 저장
answer[i] = len(prices) - 1 - i
return answer
진짜 스택으로 푼 코드를 발견했다
처음 보면 이해하기 좀 어렵다.
answer[past] = i - past #떨어지지 않은 시간 저장
이전 시점이 견딘 시간은,
현재시점-이전시점
이다.
처음 부터 설명하자면, 예를 들어
[3,3,2]
라는 prices가 있다고 치자
값이 2일 때, 바로 이전의3
일 때의 시점(인덱스 =1
)를 꺼내2
일 때의 인덱스(=2
)와의 차이를 구하여 해당 시점의가격이 떨어지지 않은 기간
을 구한다.
스택에서 제거하고 나서도3
이 있으므로 인덱스(=0
)를 꺼내2
일 때의 인덱스와의 차이를 구해 해당 시점의가격이 떨어지지 않은 기간
을 구한다.
결과적으로 answer는[2, 1, 0]
이 된다.
스택을 사용해서 그런지 빠르다! 역시 문제 취지에 맞게 푸는 게 중요하다.
프로그래머스 고득점 kit에 있는 스택/큐 문제를 다 풀어봤는데, 구글링을 안 한 문제가 없다. 역시 나는 자료구조 문제에 약한 것 같다...많은 연습이 필요해보인다.