[알고리즘][프로그래머스][코딩테스트 고득점 Kit] 스택/큐

timdalxx·2023년 3월 30일

algorithm

목록 보기
5/5

🚩[Stack / Level 1] 같은 숫자는 싫어

내 풀이

def solution(arr):
    answer = []
    pre_element = -1
    
    for element in arr:
        if pre_element != element:
            answer.append(element)
        pre_element = element

    return answer

배우고 싶은 풀이

  • 스택의 정의를 제대로 파악한 것 같다
  • 스택의 마지막 원소를 [-1] 로 표현한 점을 배우고 싶다
def no_continuous(s):
    # 함수를 완성하세요
    result = []
    for c in s:
        if len(result) == 0 or result[-1] != c:
            result.append(c)

    return result

# 아래는 테스트로 출력해 보기 위한 코드입니다.
print( no_continuous( "133303" ))

🚩[Queue / Level 2] 기능개발

내 풀이

import math
from collections import deque

def solution(progresses, speeds):
    answer = []
    need_times = deque([])
    need_days = 0
    
                  
    # FIFO
    for i in range(len(progresses)):
        need_time = math.ceil((100-progresses[i])/speeds[i])
        need_times.append(need_time)
    
    now_need_time = need_times.popleft()
    answer.append(1)
    
    while need_times:
        next_need_time = need_times.popleft()
        if now_need_time >= next_need_time:
            answer[-1] += 1
        else:
            now_need_time = next_need_time
            answer.append(1)
            
            
    return answer

🚩[Stack / Level 2] 올바른 괄호

내 풀이

def solution(s):
 answer = True


 # 닫는 괄호가 들어왔는데 여는 괄호가 없으면 False
 # 마지막인데 여는 괄호가 남아 있으면 False
 # LIFO
 open = []
 
 for s_i in s:
     if s_i == '(':
         open.append(s_i)
     else :
         if len(open)>0:
             open.pop()
         else:
             return False
         
 if len(open)>0: return False
 
 return True

배우고 싶은 풀이

  • except error 로 정확하게 오류를 필터링한 점을 배우고 싶다

  • return 을 조건문으로 한 점이 흥미롭다

    def is_pair(s):
     st = list()
     for c in s:
         if c == '(':
             st.append(c)
    
         if c == ')':
             try:
                 st.pop()
             except IndexError:
                 return False
    
     return len(st) == 0

    🚩[Queue / Level 2] 프린터

    내 풀이

    def solution(priorities, location):
    answer = 0
    # FIFO - Queue
    papers = [(prior, id) for id, prior in enumerate(priorities)]
    
    while papers:
        papers_num = len(papers)
        prior, id = papers.pop(0)
        
        for next_prior, _ in papers:
            if prior < next_prior : 
                papers.append((prior, id))
                break
        
        if len(papers) != papers_num:
            answer += 1
            if id == location:
                return answer
            
    return -1

    배우고 싶은 풀이

  • any 를 사용한 풀이

  • pair 리스트를 사용한 접근은 같으나, any 를 사용하여 if문 안에 for문을 넣어주는 코드 작성 요령을 배우고 싶다

  • if 안에 any를 넣어줌으로써 논리상 명확해지고, 내 코드의 len(papers) 관련 부분이 사라질 수 있다

    def solution(priorities, location):
     queue =  [(i,p) for i,p in enumerate(priorities)]
     answer = 0
     while True:
         cur = queue.pop(0)
         if any(cur[1] < q[1] for q in queue):
             queue.append(cur)
         else:
             answer += 1
             if cur[0] == location:
                 return answer
     # 🚩[??? / Level 2] 다리를 지나는 트럭
     # 🚩[??? / Level 2] 주식가격
profile
Major in Computer Vision

0개의 댓글