코딩 테스트/프로그래머스
[Python] 프로그래머스 lv.2 기능개발
위시리
2024. 10. 15. 21:43
알고리즘 고득점 kit - 스택/큐 - lv 2
문제 분석
- 기능 개선 작업중 : 각 기능은 진도가 100%일 때 서비스에 반영 가능
- 각 기능 개발 속도는 모두 다르기 때문에
- 뒤에 있는 기능이 앞의 기능보다 먼저 개발될 수 있고,
- 이때 뒤의 기능이 먼저 개발되면 앞의 기능이 배포될 때 함께 배포
- 먼저 배포되어야하는 순서대로 작업의 진도가 적힌 정수 배열 progresses
- 각 작업의 개발 속도가 적힌 정수 배열 speeds
- 각 배포마다 몇 개의 기능이 배포되는지 return
- 배포는 하루에 한 번
- 배포는 하루의 끝에 이루어짐
코드 설계
- 큐
- 반복문을 돌면서 언제까지? : progresses 배열이 빌 때까지
- 한 번의 반복문 == 하루
- progresses [0] 이 100 이상인지 확인
- 100이 넘지 않는다면 각 배열의 값은 같은 인덱스의 speeds의 값이 더해짐
- 100이 넘는다면 100이 넘지 않는 값이 나올 때 까지 맨 앞의 갚을 계속 popleft
- 해당 반복문에서 popleft 되는 값의 갯수(i)만큼 answer.append(i)
- progresses의 없어진 배열 수 만큼 speeds 배열 수도 제거
정답 코드
실패..
def solution(progresses, speeds):
answer = []
global cnt
while progresses :
if progresses[0] < 100 : # 맨 앞의 값이 100을 넘지 않는다면
if cnt != 0 :
answer.append(cnt)
cnt = 0
for i in range(len(progresses)):
progresses[i] += speeds[i]
else : # 맨 앞의 값이 100을 넘는다면
progresses.popleft()
speeds.popleft()
cnt += 1
return answer
다른 사람 코드 1
def solution(progresses, speeds):
answer = []
days = 0
cnt = 0
while progresses :
# 진행상황과 그 동안 지난 날짜 만큼 speed를 구해서 더하기
if (progresses[0] + days * speeds[0]) >= 100 :
progresses.pop(0)
speeds.pop(0)
# 완료된 기능 수
cnt += 1
else :
# 맨 앞이 100이 아닌데 완료된 기능이 있다면
# 앞에서 완료되어 빠져나간 상태라면
# answer에 더해주고 cnt = 0 초기화
if cnt > 0 :
answer.append(cnt)
cnt = 0
# 완료된 기능이 없다면 days + 1
else :
days += 1
answer.append(cnt)
return answer
다른 사람 코드 2
def solution(progresses, speeds):
answer = []
while progresses :
cnt = 0
while progresses and progresses[0] >= 100 :
cnt += 1
progresses.pop(0)
speeds.pop(0)
# 작업 리스트의 진도 증가
progresses = [progresses[i] + speeds[i] for i in range(len(progresses))]
# 만약 오늘 기능이 배포되었다면 결과 리스트에 추가
if cnt :
answer.append(cnt)
return answer
2회차 - 2024.11.26
문제 분석
- 진도가 100% 일 때 서비스에 반영
- 뒤에 있는 기능이 먼저 개발될 수 있지만, 앞에 있는 기능이 배포될 때 함께 배포
- progresses : 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열
- speeds : 각 작업의 개발 속도가 적힌 정수 배열
- 각 배포마다 몇 개의 기능이 배포되는지 return
- 조건
- 배포는 하루에 한 번 하루의 끝
코드 설계
- speeds 값 만큼 다 더하고 나서 배포까지 하고 나면 day+1
- speeds만큼 값 다 더하고,
- progress 맨 앞 값이 100 이상인지 확인
- 큐 : 앞에서 부터 100 이상이면 하나씩 빠짐(큐) → 빠진 갯수만큼 해당 날에 배포된 작업 수
- 배포되면 progresses에서 제거된 수만큼 & speed도 제거
- progresses에 아무 값도 남지 않으면 끝 return
정답 코드
실패 22..
from collections import deque
def solution(progresses, speeds):
answer = []
pro = deque()
for i in progresses :
pro.append(i)
while pro :
distribution = 0
for i in range(len(pro)) :
pro[i] += speeds[i]
if pro[0] >= 100 : # while
pro.popleft()
del speeds[0]
distribution += 1
if not distribution == 0 :
answer.append(distribution)
return answer
- 맨 앞부터 100 이상이면 빠지는 부분 구현 실패..
- if pro[0] >= 100 부분을 while로 수정하면 될거같은데 "IndexError: deque index out of range"
3회차 - 25.03.26
문제 분석
- 각 기능은 진도가 100%일 때 서비스에 반영할 수 있다.
- 각 기능 속도는 모두 다르기 때문에 뒤에 있는 기능이 먼저 100%가 된다면 먼저 개발될 수 있으나 앞의 있는 기능보다 먼저 배포될 수는 없다.
- progresses : 배포 순서대로 작업의 진도가 적힌 정수 배열
- speeds : 각 작업의 개발 속도가 적힌 정수 배열
- 각 배포마다 몇 개의 기능이 배포되는지 return
풀이
- progress는 앞이 빠져야 뒤가 빠질 수 있기 때문에 큐 자료구조라고 볼 수 있다.
- 개발이 완료되어 빠져나가면 해당 인덱스의 speed도 같이 사라져야 한다.
코드 설계
- 맨 앞 기능이 완성될 때까지의 날짜
정답 코드
해설 코드
def solution(progresses, speeds):
answer = []
day = 0
# 맨 앞의 기능이 완성될때 까지의 날짜?
while progresses: #구현 기능이 남아 있다면
# 날짜계산
while progresses[0] + (day * speeds[0]) < 100:
day += 1
# 맨 앞 기능이 구현됨
progresses.pop(0) # 삭제
speeds.pop(0) # 삭제
answer.append(1)
# 이전 기능이 완료됨과 동시에 뒤에 있는 기능도 완료된다면
while progresses and progresses[0] + (day * speeds[0]) >= 100:
# 이후 기능이 구현된다면
answer[-1] += 1
# 이후 기능이 구현되면 삭제
progresses.pop(0)
speeds.pop(0)
return answer
내 코드
def solution(progresses, speeds):
answer = []
days = 0
cnt = 0
while progresses :
# 배포할 수 있는 것들 다 확인
while progresses and (progresses[0] + days * speeds[0]) >= 100 :
if len(progresses) == 0 :
break
print(progresses[0] + days * speeds[0])
cnt += 1
progresses.pop(0)
speeds.pop(0)
# 배포된게 있으면
if cnt > 0 :
answer.append(cnt)
cnt = 0
# 없으면 하루만 지남
else :
days += 1
# answer.append(cnt) # 맨 마지막
return answer