프로그래머스 Lv2 문제입니다. 실전에 대비하기 위해 60분 시간제한을 두고 풀었습니다.
문제
https://school.programmers.co.kr/learn/courses/30/lessons/42586
[나의 풀이]
⌛ 27분 소요
def solution(progresses, speeds):
answer = []
while progresses:
cnt = 0
over_100 = True
for idx,speed in enumerate(speeds):
progresses[idx] += speed
if over_100:
if progresses[idx] >= 100:
cnt +=1
else:
over_100 = False
progresses = progresses[cnt:]
speeds = speeds[cnt:]
if cnt:
answer.append(cnt)
return answer
Queue 자료구조를 활용하는 문제입니다. 입력된 기능별 진행률 progresses, 하루 기능별 진행률
speeds가 주어지고 순서대로 100% 완료된 기능이 생길때마다 완료된 기능의 갯수를 구하는 문제입니다. 🐱🐱🐱
보통 Queue를 구현할 때는 deque 라이브러리를 활용하여 popleft(), append()를 자주 사용하였습니다. 하지만 위 문제 경우에는 모든 기능별로 하루 진행도를 더해야하는 구조이기 때문에 리스트함축표현식을 사용하기 위해 deque로 큐를 표현하는 대신 인덱스로 접근하여 진행도를 업데이트하고 슬라이싱으로 popleft()를 표현하여 해결하였습니다.
[다른 사람의 풀이1]
import math
def solution(progresses, speeds):
progresses = [math.ceil((100 - a) / b) for a, b in zip(progresses, speeds)]
answer = []
front = 0, 0
for idx in range(len(progresses)):
if progresses[idx] > progresses[front]:
answer.append(idx - front)
front = idx
answer.append(len(progresses) - front)
return answer
수식을 통해 기능별로 100%를 달성하는 일수를 구한뒤 인덱스롤 활용하여 구현한 풀이입니다. 100% 달성 일수를 구하기 위해 math.ceil((100/현재 진행도)/하루 진행도)로 표현한 부분이 간결하고 빠른 속도로 해결할 수 있는 풀이였습니다.🐻❄️🐻❄️🐻❄️
[다른 사람의 풀이2]
def solution(progresses, speeds):
answer = []
days = 0 # 날짜 세기
cnt = 0 # 완료된 기능
while len(progresses) > 0:
# 기능의 진행상황과 그 동안 지난 날짜만큼의 speed를 구해서 더하기
if(progresses[0]+days*speeds[0])>=100:
# 완료되면 리스트에서 제거
progresses.pop(0)
speeds.pop(0)
# 완료된 기능 수
cnt += 1
else:
# 만약 완료된 기능이 있다면 answer에 더해주고 0으로 초기화
if cnt > 0:
answer.append(cnt)
cnt = 0
# 완료된 기능이 없으면 days 추가
else:
days+=1
answer.append(cnt)
return answer
진행 일수에 따른 기능별 진행도를 모두 구하는 방식이 아닌 진행 일수에 따른 첫번째 기능의 진행도를 고려하는 방식입니다. 만약 100% 완료된 기능이 있다면 미완료된 기능이 있을 때까지 while문으로 pop()하고 그 갯수를 반환합니다. 반대로 완료된 기능이 없을 시에는 days(진행 일수)를 누적하여 맨 앞단의 기능을 우선적으로 고려하는 알고리즘이었습니다. 전체 기능별 진행도 리스트를 구할 필요가 없는 방식으로 가장 빠른 속도를 보였습니다.🐹🐹🐹
감사합니다.