알고리즘 문제 풀이 - 스택/큐

zio도미닉·2021년 10월 2일

프로그래머스 문제 풀이

기능개발

풀이

  1. [7,70,45] // 1,30,5 ->[7,3,9] 로 만들기
  2. queue를 이용
    • 2-1. 큐에서 1개 꺼냄
    • 2.2 꺼낸 데이터가 다음 큐의 데이터 보다 작으면 (while)
      cnt+=1
    • 2.3 크면 break
    • 2.4 answer.append(cnt)

방법 1. 다음 꺼를 인덱스로 확인하고 비교한 다음에 빼는 방법
방법 2. 미리 뽑고 다음에 조건에 안 맞으면 다시 넣는 방법

알게 된 점

  • /는 소수점 포함 나눗셈 7/3 =2.333
  • //는 몫 (모듈려) 7//3 =2
  • %는 나머지
  • 파이썬은 큐의 인덱스 접근 및 insert 메소드를 이용하여 인덱스로 삽입이 가능

코드

import math
from collections import deque


def solution(progresses, speeds):

    queue=deque()
    # 1.
    for i in range(len(progresses)):
        val = math.ceil((100 - progresses[i]) / speeds[i])
        queue.append(val)

    answer = []
    # 2. queue
    while queue:
        data=queue.popleft()
        cnt=1

        # 방법 1
        # while queue:
        #     next = queue[0]
        #     if check >= next:
        #         queue.popleft()
        #         cnt += 1
        #
        #     else:
        #         break

        # 방법 2
        while queue:
            next=queue.popleft()
            if data>=next:
                cnt+=1

            else :
                queue.insert(0,next)
                break



        answer.append(cnt)

    print(answer)

    return answer

프린터

풀이 방법

  1. enumerate로 [인덱스, 데이터]로 만들고 queue에 넣기
  2. check 함수만들기, 뽑은 데이터보다 더 큰 데이터가 있는지 확인하는 함수
    • 3-1. 만약 check()가 true이라면 맨 뒤에 넣기
    • 3-2. false 출력하고 몇번째로 출력되는지 알기 위해 answer 증가시키기
    • idx하고 주어진 location이 맞으면 break로 종료하기
from collections import deque


def solution(priorities, location):
    # 1. enumerate로 [인덱스, 데이터]로 만들고 queue에 넣기
    queue = deque()
    for idx, pri in enumerate(priorities):
        temp = [idx, pri]
        queue.append(temp)

    print(queue)

    # 2. check 함수만들기, 뽑은 데이터보다 더 큰 데이터가 있는지 확인하는 함수
    def check(val):
        for idx, data in queue:
            if val < data:
                return True

        else:
            return False


    answer = 0
    # 3. 큐
    while queue:
        idx, val = queue.popleft()
        pan = check(val)
        # 3-1. 만약 check()가 true이라면 맨 뒤에 넣기
        if pan:
            queue.append((idx, val))
        # 3-2. false 출력하고 몇번째로 출력되는지 알기 위해 answer 증가시키기, idx하고 주어진 location이 맞으면 break로 종료하기
        else:
            answer += 1
            if idx == location:
                break

    print(answer)

    return answer
profile
BackEnd Developer

0개의 댓글