[just-stopyoon] programmers_기능개발_Python #16
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
🔗 문제 링크
📰 문제 요약
문제 설명
입력
progresses
: 먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열speeds
: 각 작업의 개발 속도출력
return
조건
progresses
,speeds
의 배열의 길이는 100개 이하progresses
< 100,speeds
≤ 100🔓 문제 접근 방식
기본 아이디어
사용 알고리즘
FIFO(First In, First Out)
여야 하므로 큐를 이용해서 구현한다.💻 구현 방법
while
문을 활용하여,progresses
속 원소가 없을 때까지 진행1차 시도 → 시간 초과
시간 초과가 발생하는 주요 원인은
for
루프 내에서progresses.pop(0)
을 사용하기 때문이었다.pop(0)
은 리스트의 첫 번째 요소를 제거하므로, 리스트가 길어질수록 연산 비용이 커지기 때문인데, 리스트에서 첫 번째 요소를 제거하려면 나머지 요소를 모두 이동해야 하므로 O(n)의 시간 복잡도를 가진다.2차 시도
pop
과정의 최소화와 불필요한for문
사용을 방지하기 위해,day
라는 변수를 활용해서 일괄적으로 더하는 과정 없이, 날짜별로 판단할 수 있는 방식을 사용하기로 결정하였다.마지막에 진행되는 일들에 대해서
while문
이 종료되면서 카운트가 진행되지 않아,answer
에 추가 되지 않는 일이 발생했다.따라서, 모든 일들이 완료된 후,
(len(progresses == 0)
이 된 상황에서 마지막으로 카운팅한cnt
값을answer
에 추가하는 코드를 추가했다.👍🏻 최종 제출 코드
📝 새로 학습한 내용
zip
을 사용하여 작업 속도 반영을 편리하게 해보고 싶었는데,pop
의 시간복잡도 때문에 실패했었다.다른 사람의 풀이를 보니,
zip
을 사용한 풀이가 있었는데,이 코드는 작업속도(
progresses
와speeds
)를 기반으로, 각 작업의 완료 날짜를 계산하고, 같은 날짜에 배포할 수 있는 작업들을 묶어 그 수를 반환하는 형식이었다.처음 코드를 봐서는 이해가 잘 가지 않아, GPT를 통해서 다시 한 번 이해를 진행해보았는데,
Q
초기화:Q
는 각 배포 그룹의 정보([완료까지 필요한 날짜, 작업 수]
)를 저장하는 리스트입니다.zip(progresses, speeds)
:progresses
와speeds
를 병렬로 순회하면서 각 작업의 진행 상황(p
)과 속도(s
)를 가져옵니다.((p - 100) // s)
:p - 100
은 작업이 완료될 때까지 남은 진행도를 계산.//
는 정수 나눗셈으로 몫을 구함.(...)
는 나머지가 있는 경우 올림 처리를 위해 사용.((93 - 100) // 1) = 7
(7일 후 완료).if len(Q) == 0 or Q[-1][0] < -((p - 100) // s):
:첫 번째 조건
len(Q) == 0
:Q
가 비어 있는 경우, 첫 작업의 완료 날짜와 작업 수를 초기화하여 추가합니다.두 번째 조건
Q[-1][0] < -((p - 100) // s)
:Q[-1][0]
)보다 현재 작업의 완료 날짜가 늦는 경우, 새로운 배포 그룹을 생성합니다.두 조건 중 하나라도 참이면:
Q
에 추가합니다.else:
:위 조건을 만족하지 않는 경우:
Q[-1]
)의 작업 수를 증가시킵니다:return [q[1] for q in Q]
:Q
에 저장된 각 배포 그룹의 작업 수(q[1]
)만 리스트로 추출하여 반환합니다.첫 번째 작업부터 완료할 수 있는 날짜를 계산하여서 리스트에 별도로 저장한 후, 이후 작업 완료를 위해 필요한 일수가 더 큰 작업이 나올 때까지의 기능을 묶어서 반환하는 형식이었다.
확실히 각 작업의 완료 날짜를 계산한 후, 배포 가능한 작업들을 그룹으로 묶어 작업 수를 반환하므로, 시간 복잡도가 효율적인 것을 확인할 수 있었다.