[프로그래머스-LV2] 주식가격 (좋은 풀이)

아이엠강욱·2023년 5월 10일
0

코딩테스트

목록 보기
6/23

해당 문제를 확인하시고 싶으면 아래 링크를 통해 확인해주세요!
https://school.programmers.co.kr/learn/courses/30/lessons/42584


1. 문제설명

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

제한 사항

  • prices의 각 가격은 1이상 10,000 이하인 자연수
  • prices의 길이는 2이상 100,000 이하

입출력 예시

prices: [1, 2, 3, 2, 3]
return: [4, 3, 1, 1, 0]

입출력 예시 설명

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

2. 내가 풀었던 코드와 좋은 코드?

이 문제는 알고 보니까 스택/큐를 활용해서 해결하는 문제였다.
하지만 나는.. 그런걸 모르고 그냥 구현문제라 생각하고 냅다 풀어버렸다.
물론 어렵게 풀진 않았지만 다른사람의 풀이를 보니 전부 큐를 사용해서 풀이를 하셨더라.

아직은 초창기여서 그렇지만 문제를 보고 어떤 유형의 문제인지를 가장 먼저 파악하는게 제일 중요할 것 같다. 나는 파악하는 단계를 거쳐서 그냥 바로 문제 읽고 구현문제 풀듯이 풀이를 해서 그런지....ㅎ

"""
프로그래머스 LV2: 주식가격
https://school.programmers.co.kr/learn/courses/30/lessons/42584
"""

def solution(prices):
    answer = []
    
    # 1초부터 (prices의 길이)초만큼 반복문 순회
    for sec in range(1, len(prices)+1):
        decreaseCheck = False   # 감소하는 값 확인했는지 체크하는 변수
        for i in range(sec, len(prices)):
            if prices[sec-1] > prices[i]:   # 해당 시점의 가격보다 낮은 가격이 있다면 (떨어지고 있는 시점을 확인)
                decreaseCheck = True   # 감소하는 값 확인 표시
                answer.append(i+1-sec)   # 가격이 떨어지지 않은 시간 append
                break   # 반복문 탈출
        if decreaseCheck == False:   # 해당 시점의 가격보다 낮은 가격이 없음
            answer.append(len(prices) - sec)   # 가격이 떨어지지 않은 기간을 append
    
    return answer


prices = [1, 2, 3, 2, 3]
print(solution(prices))

물론 프로그래머스에서 테스트케이스랑 효율성 테스트 전부 통과하긴 했지만 다른 사람의 풀이도 궁금해서 봤더니 전부 큐를 사용해서 풀으셔서 나도 한번 다시 풀어보자 하고 풀어봤다.

from collections import deque

def solution(prices):
    queue = deque(prices)   # queue로 지정
    result = []
    
    while queue:   # queue에 data가 있는동안
        price = queue.popleft()   # 시간 순서대로의 price를 pop한다
        time = 0   # 시간 변수

        for p in queue:   # 첫 가격 빼고 남은 데이터들 반복문 순회
            time += 1   # 시간 1 추가
            if price > p:   # 감소세가 보이면
               break 
        result.append(time)

    return result

prices = [1, 2, 3, 2, 3]
print(solution(prices))

어쩜 이렇게 간단하고 영롱하단 것이냐... 위에 구현식으로 푼거는 40분정도 걸렸던거 같은데 큐를 사용해서 푸니 10분밖에 안걸렸다 (한번 풀어봐서 그런가?)

어쨌든 이 문제를 풀면서 중요하다고 느낀거는 문제 유형을 파악해서 효율적인 방법을 도출해내는 연습을 많이하자!

profile
블로그 이전했습니다!! https://dev-iamkanguk.tistory.com/ <<- 여기로 오세용!!

0개의 댓글