[프로그래머스] 코딩테스트 고득점 Kit - 스택/큐 (파이썬)

철웅·2023년 3월 21일
0
post-thumbnail

💻 같은 숫자는 싫어 (level 1)

def solution(arr):
    answer = []
    for num in arr:
        if not answer:   # answer가 비어있을 때는 answer[-1]이 안 먹힌다. (초기값 설정)
            answer.append(num)
        if num != answer[-1]:	# 그 후 다른 값이 나올 때마다 추가
            answer.append(num)
    
    return answer

💻 기능개발 (level 2)

import math

def solution(progresses, speeds):
    remain = []
    for i, j in zip(progresses, speeds):
        remain.append(math.ceil((100-i)/j))	# 100% 까지 남은 일수
    
    temp = 0
    answer = []
    for i in remain:
        if temp == 0 or i>temp:
            temp = i
            answer.append(1)
            continue
        else:
            answer[-1] += 1
    
    return answer


💻 올바른 괄호 (level 2)

def solution(s):
    stack = []
    if s[0] == ')':
        return False
    
    for b in s:
        if b == '(':
            stack.append(s)
        else:
            if not stack:
                return False
            stack.pop()
            
    if not stack:
        return True
    else:
        return False
  • 문자열이 ')'로 시작할 때는 무조건 false
  • '('만 stack에 넣어주고 ')'가 나왔을 때 하나씩 빼주는 방식으로 구현하였다.

💻 프린터 (level 2)

from collections import deque

def solution(priorities, location):
    que = deque((v,i) for i,v in enumerate(priorities))
    order = 0

    while(que):
        m = max(que)[0]
        item = que.popleft()
        if item[0] == m:
            order += 1
            if item[1] == location:
                return order
            else:
                continue
        else:
            que.append(item)
  • [1,1,9,1,1,1] location:0 으로 예시를 들어보면
    제일큰 max값을 지정해놓고 그거보다 작은 값들은 다 뒤로 보낸다.
    이걸 반복하다가 location이랑 똑같은 요소가 나오면 바로 return

💻 다리를 지나는 트럭 (level 2)

def solution(bridge_length, weight, truck_weights):
    count = 0
    trucks_on_bridge = [0] * bridge_length
    while trucks_on_bridge:
        count += 1
        trucks_on_bridge.pop(0)

        if len(truck_weights):
            if sum(trucks_on_bridge) + truck_weights[0] <= weight:
                trucks_on_bridge.append(truck_weights.pop(0))
            else:
                trucks_on_bridge.append(0)
    return count
  • 문제 설명이 조금 부족했던게 이렇게 트럭이 나갈 때도 1초가 더 소요된다는걸 말 안해줌.
  • 하다가 머리 터질거 같아서 인터넷에서 코드 배낌 링크
  • stack에 length 만큼 0을 주면서 if 문에서 따로 length를 체크 안 해도 되게 하는게 포인트인거 같다.
  • while len(trucks_on_bridge): -> while trucks_on_bridge:
    로 바꿨더니 시간초과가 났다. len을 쓰는게 더 빠르나보다. 처음 알았음
  • 또한 list_name.pop(0) 처럼 pop메소드에 인자로 0을 주면 큐 처럼 맨 앞에거를 빼준다. 이것도 처음 알았다..
  • 흐름을 프린트문으로 찍어봤다.

💻 주식가격 (level 2)

def solution(prices):
    ans = [0] * len(prices)
    for i in range(len(prices)-1):
        cnt = 0
        for j in range(i+1, len(prices)):
            if prices[i] <= prices[j]:
                cnt += 1
                continue
            else: 
                cnt += 1	# 바로 떨어질 경우(크거나 같은 값이 없을경우) default = 1
                break
        ans[i] = cnt
    
    return ans
  • 뒤에 원소 하나하나 확인하는 방법을 썼다.
  • 첫 번째 for문에서 i의 범위가 range(len(prices)-1) 인 이유는 마지막 원소는 어차피 0이니까

총평 : 트럭 문제 빼고는 다 쉽다

0개의 댓글