해당 문제를 확인하시고 싶으면 아래 링크를 통해 확인해주세요!
https://school.programmers.co.kr/learn/courses/30/lessons/42586?language=python3
문제는 해결했음! 테스트 케이스 모두 정상적으로 통과는 했다 헤헤
from collections import deque
def solution(progresses, speeds):
answer = []
queue = deque([[progresses[i], speeds[i]] for i in range(len(progresses))]) # Queue 생성
while queue: # Queue가 빌때까지
# 개발 진행
for _ in range(len(queue)):
project = queue.popleft()
if project[0] < 100: # 진행률이 100미만이면 진행률만큼 증가
project[0] += project[1]
queue.append(project) # 다시 queue에다 넣어줌
# 다음날 넘어가기 전 배포할 수 있는게 있는지 확인
production = 0 # 배포한 기능 개수
while queue:
data = queue.popleft() # 맨 위의 작업을 뺌
if data[0] >= 100: # 진행률이 100 (100이상)이면 배포진행
production += 1
else: # 진행률이 100 미만인게 있으면 다음날로 넘어가야함
queue.appendleft(data) # 다시 원래 자리에 작업넣음
break # 배포단계 중단
if production != 0: # 배포한 기능이 있으면 결과배열에 넣음
answer.append(production)
return answer
나는 그냥 문제에 나와있는대로 깊게 생각하지 않고 진행했다.
- deque 라이브러리를 사용해서 입력받은 데이터들을 조합해서 넣음
- queue에 작업이 남아있으면?
a. 진행 상황이 100 미만이면 진행률만큼 진행상황 증가 + 다시 queue에 넣어줌
b. 다음날로 넘어가기 전 밤에 배포할 수 있는게 확인한다. queue에서 맨 위의 작업을 하나 빼서 진행상황이 100이상이면 배포를 해버리고 100미만인걸 만나버리면 배포를 중단한다 + 그날의 배포개수 저장- 작업들이 끝나면 로직 종료
이렇게 되니까 테스트케이스는 통과했지만.. 반복문의 개수가 너무 많아지고 비효율적인 것 같다는 생각이 들었다. 물론 실제 코딩테스트였으면 통과했겠지만.. 그래도 많이 아쉬운..?
그래서 다른 사람의 풀이를 조금 참고했다.
def solution(progresses, speeds):
answer = []
time = 0
count = 0
while progresses:
if (progresses[0] + time*speeds[0]) >=100 : # 하나의 기능 개발 완료
progresses.pop(0)
speeds.pop(0)
count +=1 # 넘어간 개발의 수
else : # 더 개발해야함 # 시간이 더 필요
if count > 0 : # 연속으로 넘어갈 기회를 놓침
answer.append(count)
count = 0
time += 1
answer.append(count)
return answer
위의 풀이는 일단 queue를 사용하지 않았다.
나의 풀이보다 많이 간결해보이고 이해하기 쉬운 코드여서 가져와봤다.
나는 queue를 사용했고 그 queue를 한번 반복문으로 순회를 해서 작업률만큼 추가해주는 작업이 있었는데, 위의 풀이에서는 작업률을 추가해주는 작업은 딱히 없는 것이다.
progresses[0] + time * speed[0] >= 100
을 통해 값을 저장하지 않고 계산만 해서 진행상황이 100이상이면 그 작업은 배포가 가능하기 때문에 배포를 해버린다.
그리고 100미만이면 time을 추가하는데 이때 count(배포 개수)가 0 이상이면 이전에 배포를 한적이 있다는 뜻이고 배포를 진행하다가 진행상황이 100미만인걸 만났기 때문에 배포가 중단되어야 하니까 count를 다시 0으로 세팅해준다.
위의 코드에서는 반복문을 1개만썼는데... 나는 어떻게보면 반복문을 총 4개나 써버렸다.
코딩테스트에서는 그렇다치고.. 만약에 회사에 가서 두 코드를 비교한다면 당연히 나같아도 위의 코드를 택할 것 같다.
실제 코딩테스트에서는 시간이 부족하니까 어쩔수 없겠지만 개인공부나 프로젝트할때는 항상 두번 세번 여러번 생각을 해서 효율적인 코드를 작성할 수 있었으면 좋겠다.