https://school.programmers.co.kr/learn/courses/30/lessons/42586
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
from collections import deque
def solution(progresses, speeds):
pair = zip(progresses, speeds)
pair = deque(pair)
stack = []
result = []
while pair:
progress, speed = pair.popleft()
remainder = 100 - progress
x,y = divmod(remainder, speed)
if y > 0:
x +=1
if stack != [] and stack[-1][0] >= x:
a, b = stack.pop()
stack.append((a, b+1))
else:
stack.append((x, 1))
result = [i for _, i in stack]
return result
문제해결을 위하여 stack
과 collections
모듈의 deque
자료구조를 활용하였습니다.
zip()
, deque()
를 사용하여 progresses
, speeds
리스트를 쌍으로 묶어서 pair
(deque
자료구조)을 만들었습니다.
while
문을 사용하여 pair
가 빌때까지 반복합니다.
popleft()
함수를 사용해 pair
의 가장 앞에 있는 progress
, speed
를 추출하고 남은진도 remainder
를 계산합니다.
remainder
와 speed
를 divmod
함수를 사용하여 몫과 나머지를 계산합니다.
x
와 y
는 각각 몫과 나머지를 의미합니다.
x
일간 작업후에 배포가 가능한데 나머지(y
)가 존재한다면 x
에 1
을 더해 줍니다.
예를들어 위의 빨간색 테두리 부분을 확인해보면
두 번째 기능이 30%가 완료되어 남은 진도 remainder
은 70%가 됩니다.
이때 70
을 주어진 30(speed)
으로 몫(x
)과 나머지(y
)를 계산해주면 x = 2
, y=10
이 나오게 되는데 이때 2일 지났다고 작업이 완성된것은 아닙니다. 즉 나머지 10이 존재하기 때문에 x
에 1
을 더해 주는것입니다.
그리고 저장할 stack
이 비어있지 않거나 stack[-1][0]
으로 이전 작업의 배포가 가능한 일자를 확인해보고 stack[-1][0]
이 x
보다 크거나 같다면
이전작업의 배포가 가능한 일자(a
)와 기능을 세는 b
를 추출하고 stack
에 a
와 b+1
을 해줍니다.
위의 조건에 부합하지 않다면 stack
에 x
와 1
을 저장줍니다.
모든 반복문이 종료되면 result
에 기능만 추출하여 반환합니다.
'코딩테스트' 카테고리의 다른 글
[코딩테스트] 프로그래머스 베스트앨범 파이썬(Python) (0) | 2023.02.08 |
---|---|
[코딩테스트] 프로그래머스 뒤에 있는 큰 수 찾기 파이썬(Python) (0) | 2023.02.07 |
[코딩테스트] 백준 촌수계산 파이썬(python) (0) | 2023.02.02 |
[코딩테스트] 프로그래머스 [1차] 다트 게임 파이썬(Python) (0) | 2023.02.01 |
[코딩테스트] 프로그래머스 [카카오 인턴] 키패드 누르기 파이썬(Python) (0) | 2023.01.31 |