[프로그래머스-레벨2]주식가격 - python

iamjinseo·2022년 9월 14일
0

문제풀이-Python

목록 보기
99/134
post-custom-banner

https://school.programmers.co.kr/learn/courses/30/lessons/42584#

문제 설명
초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요.

제한사항
prices의 각 가격은 1 이상 10,000 이하인 자연수입니다.
prices의 길이는 2 이상 100,000 이하입니다.

입출력 예

pricesreturn
[1, 2, 3, 2, 3][4, 3, 1, 1, 0]

입출력 예 설명

  • 1초 시점의 ₩1은 끝까지 가격이 떨어지지 않았습니다.
  • 2초 시점의 ₩2은 끝까지 가격이 떨어지지 않았습니다.
  • 3초 시점의 ₩3은 1초뒤에 가격이 떨어집니다. 따라서 1초간 가격이 떨어지지 않은 것으로 봅니다.
  • 4초 시점의 ₩2은 1초간 가격이 떨어지지 않았습니다.
  • 5초 시점의 ₩3은 0초간 가격이 떨어지지 않았습니다.

시도

1

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])

문제는 스택/큐이지만 완전탐색으로 풀 수 있을 것 같아 이중 반복문으로 시도함.

결과


답이 없음

2

지금까지 문제가 지금 값보다 이상인 값을 있음 그만큼 개수 세라는 뜻인줄 알았는데 그게 아님

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에 있는 스택/큐 문제를 다 풀어봤는데, 구글링을 안 한 문제가 없다. 역시 나는 자료구조 문제에 약한 것 같다...많은 연습이 필요해보인다.

profile
일단 뭐라도 해보는 중
post-custom-banner

0개의 댓글