[코테] 스택/큐 - 기능개발[프로그래머스]

Bpius·2023년 6월 6일
0

알고리즘 문제풀이

목록 보기
16/28
post-thumbnail

문제

출처: 프로그래머스 - 기능개발

풀이 1 : 큐

제일 앞 인덱스를 계속 확인하면서 진행해야 하기에 자료구조 큐를 활용한다.
progresses 제일 앞 인덱스의 값을 확인하면서 100 이상이 되면 숫자를 세어주고, 아니면 progresses에 speeds값을 각 인덱스에 맞춰 한 번씩 더해준다.
제일 인덱스 0의 값을 계속 확인해야 하기에 자료구조 큐(deque)를 사용하여 제일 앞의 인덱스 값이 합하여 100이 되지 않을 시 다시 큐에 append 하도록 한다. 합이 100 이상이라면 배포가 가능하기에 숫자를 세어주고 작업개수(progresses, speeds)에서 빼내도록 한다.

코드 1 : 큐

from collections import deque
def solution(progresses, speeds):
    answer = []
    dp = deque(progresses)
    ds = deque(speeds)
    cnt = 0
    while dp:
        if dp[0] + ds[0] >= 100: # 100이상이 되어야 배포가 가능하기에
            dp.popleft() # 배포 후에는 작업개수에서 빼도록 한다.
            ds.popleft()
            cnt += 1
        else:
            if cnt > 0:
                answer.append(cnt)
            else:
                for _ in range(len(dp)): # 작업개수를 반복하면서 100이 되도록 계속 더하도록 한다.
                    p = dp.popleft()
                    s = ds.popleft()
                    p += s
                    dp.append(p)
                    ds.append(s)
            cnt = 0 # cnt를 초기화
            
    answer.append(cnt) # 제일 마지막 작업개수가 끝나면 반복문이 중단되고 그 수를 추가하는 것

    return answer

if __name__ == '__main__':
    pregresses = [93, 30, 55]
    speeds = [1, 30, 5]
    print(solution(pregresses, speeds))

풀이 2 : 스택(자료구조 리스트)

후입선출 방식인 스택 풀이는 아니지만, 스택은 자료구조 리스트를 활용하기에 인덱스를 활용하여 리스트로 풀 수 있다.
작업개수는 리스트로 주어지며 각 인덱스가 작업진도와 스피드가 한 셋트이기에 각 인덱스에 동일하게 speeds값을 몇 회 더해줄 것인지 확인하면서 진행하도록 한다.
몇 회 더해줄 것인지 확인하는 변수를 하나 생성하여 횟수를 거듭 올려주면서 100 이상이 될 때까지 확인한다.
pregresses가 100이상이라면 숫자를 세고 pregresses, speeds의 첫 번재 인덱스 값을 빼도록 한다. 100이 아니라면 100이 될 때까지 횟수를 올려주도록 한다.

코드 2 : 스택(자료구조 리스트)

def solution(progresses, speeds):
    answer = []
    time = 0 # 횟수
    cnt = 0
    while progresses:
        if progresses[0] + time * speeds[0] >= 100:
            progresses.pop(0)
            speeds.pop(0)
            cnt += 1
        else:
            time += 1 # 100이 될 때까지 계속 1씩 횟수를 올려준다.

            if cnt > 0:
                answer.append(cnt)
                cnt = 0
                
    answer.append(cnt)
    
    return answer

if __name__ == '__main__':
    pregresses = [93, 30, 55]
    speeds = [1, 30, 5]
    print(solution(pregresses, speeds))
profile
데이터 굽는 타자기

0개의 댓글