https://school.programmers.co.kr/learn/courses/30/lessons/42586
이 문제의 해결과정은 다음과 같다.
1. progresses와 speeds 값을 참고하여 각각의 기능이 구현되는 기간을 담는 리스트 days를 구한다.
이는 간단한 방정식과 올림을 사용하여 구현 가능하다. (아래의 코드 참고)
2. 배포기준을 잡고, 배포그룹별 몇 개의 기능이 포함되어 있는지 확인한다.
import math
def solution(progresses, speeds):
days = []
for i in range(len(progresses)):
days.append(math.ceil((100 - progresses[i]) / speeds[i])) # 각 작업의 남은 일수를 계산
answer = []
current_deployment = days[0] # 첫 번째 배포 기준
count = 1
for i in range(1, len(days)):
if days[i] <= current_deployment:
count += 1 # 현재 배포 그룹에 포함
else:
answer.append(count) # 현재 배포 그룹의 작업 개수 저장
current_deployment = days[i] # 새로운 배포 기준 설정
count = 1 # 새 배포 그룹 초기화
answer.append(count) # 마지막 배포 그룹 추가
return answer
코드를 하나씩 살펴보자.
current_deployment = days[0]
count = 1
- current_deployment는 첫 번째 배포 기준을 설정한다. 처음에는 첫 번째 작업이 완료되는 날을 기준으로 잡는다.
- count는 현재 배포 그룹에 포함된 작업의 개수를 센다. 처음에는 첫 번째 작업이 포함되므로 1로 초기화한다.
for i in range(1, len(days)):
if days[i] <= current_deployment:
count += 1 # 현재 배포 그룹에 포함
else:
answer.append(count) # 현재 배포 그룹의 작업 개수 저장
current_deployment = days[i] # 새로운 배포 기준 설정
count = 1 # 새 배포 그룹 초기화
- for 루프는 days 리스트의 두 번째 요소부터 마지막 요소까지 순회한다.
- if days[i] <= current_deployment: 조건문은 현재 작업이 첫 번째 배포 기준일인 current_deployment보다 빨리 완료될 수 있는지를 확인한다.
- 조건이 참일 경우: 이 작업은 현재 배포 그룹에 포함된다. count를 1 증가시킨다.
- 조건이 거짓일 경우: 이 작업은 새로운 배포 그룹이 시작된다는 의미다.
- 현재까지 세어온 count를 answer 리스트에 추가한다.
- 새로운 배포 기준을 현재 작업의 완료일(days[i])로 설정한다.
- count를 1로 초기화하여 새로운 배포 그룹에 포함된 첫 작업을 기록한다.
answer.append(count)
- 반복문이 끝난 후, 마지막 배포 그룹에 대한 count를 answer 리스트에 추가한다.
- 이렇게 함으로써 마지막 배포 그룹도 누락되지 않고 결과에 포함된다.
위와 같이 제출하면 정답이다. 하지만 days를 구할 때 한줄풀이가 존재한다.
아래와 같이 수정해줬다.
import math
def solution(progresses, speeds):
days = [math.ceil((100 - p) / s) for p, s in zip(progresses, speeds)] # 각 작업의 남은 일수를 계산
answer = []
current_deployment = days[0] # 첫 번째 배포 기준
count = 1
for i in range(1, len(days)):
if days[i] <= current_deployment:
count += 1 # 현재 배포 그룹에 포함
else:
answer.append(count) # 현재 배포 그룹의 작업 개수 저장
current_deployment = days[i] # 새로운 배포 기준 설정
count = 1 # 새 배포 그룹 초기화
answer.append(count) # 마지막 배포 그룹 추가
return answer
'Algorithm > 코딩테스트 고득점 Kit' 카테고리의 다른 글
[고득점 Kit / 스택&큐] 프로세스 (0) | 2024.09.06 |
---|---|
[고득점 Kit / 스택&큐] 올바른 괄호 (0) | 2024.09.05 |
[고득점 Kit / 스택&큐] 같은 숫자는 싫어 (0) | 2024.09.04 |
[고득점 Kit / 해시] 의상 (Counter, 리스트 컴프리헨션) (0) | 2024.09.02 |
[고득점 Kit / 해시] 전화번호 목록 (find, startswith, endswith) (0) | 2024.09.02 |