https://programmers.co.kr/learn/courses/30/lessons/42586
🚩 문제 설명
◾ 배포되는 일수를 리턴하는 문제
◾ 작업은 순서가 있고, 만약 전에 있는 작업이 끝나지 않으면 배포하지 못한다.
✅ 입출력
progresses : 먼저 배포 되어야하는 우선순위가 적힌 배열
speeds : 각 작업의 개발 속도
return ➡️ 배포되는 일수마다 몇 개의 작업이 배포되는가
progresses | speeds | return |
[93, 30, 55] | [1, 30, 5] | [2, 1] |
[95, 90, 99, 99, 80, 99] | [1, 1, 1, 1, 1, 1] | [1, 3, 2] |
✔️ 예시
◾ 93% 완료된 첫번째 작업은 7%가 남았고 speeds가 1%씩이므로 ➡️ 7일 걸린다.
◾ 30% 완료된 두번째 작업은 70%가 남았고 speeds가 30%씩이므로 ➡️ 3일 걸린다.
- 하지만 첫번째 작업이 아직 끝나지 않았으므로, 7일날 같이 배포된다.
◾ 55% 완료된 두번째 작업은 45%가 남았고 speeds가 5%씩이므로 ➡️ 9일 걸린다.
◾ 따라서 첫번째, 두번째 작업은 7일날 같이 2개 배포되고, 세번째 작업은 9일날 하나 배포된다.
📑 문제 풀이
with 파이썬 (Python)
import math
def solution(progresses, speeds):
ans = []
days = []
for p, s in zip(progresses, speeds):
left = 100 - p # 남은 퍼센트 구하기
days.append(math.ceil(left / s)) # 배포 지연 일수
pivot = 0
for i in range(len(days)):
cnt = 0
for j in range(pivot, len(days)):
if days[i] < days[j]:
break
pivot += 1
cnt += 1
if cnt != 0:
ans.append(cnt)
return ans
💬 Point
➡️ math.ceil() : 소수점을 무조건 올림처리한다. 정수면 그대로 둔다.
➡️ pivot을 만들어 이미 센 작업은 넘어간다.
◾ 우선 반복문을 돌아서 각 작업의 배포 지연 일수를 구한다.
- 만약 progresses = [93, 30, 55] 라면,
- 각 배포 지연 일수는 [7, 3, 9]가 된다.
◾ 두번째 반복문을 돌면서 다음 작업의 배포 지연 일수가 자신보다 작다면 카운트 한다.
7 | 3 | 9 | cnt | |
7 | ⭕ | ⭕ | ⭕ | 3 |
3 | ❌ | ❌ | ❌ | none |
9 | ❌ | ❌ | ⭕ | 1 |
◾ 위와 같이 세기 위하여 pivot를 사용한다.
◾ pivot 부터 시작하여 len(days) 만큼 센다.
◾ 만약 days[i] < days[j] 라면 break 한다.
- 자신의 배포 지연 일수보다 작은 값들을 세는 과정
◾ 만약 cnt가 0이라면 ans 배열에 추가하지 않는다.
728x90
'✏️ 𝗔𝗹𝗴𝗼𝗿𝗶𝘁𝗵𝗺 > 프로그래머스' 카테고리의 다른 글
[PG72411] 메뉴 리뉴얼 (0) | 2021.11.29 |
---|---|
[PG42889] 실패율 (0) | 2021.11.24 |
[PG12901] 2016년 (0) | 2021.11.23 |
[PG42888] 오픈채팅방 (0) | 2021.11.21 |
[PG42860] 조이스틱 (0) | 2021.11.06 |