기능개발

mason.98·2022년 10월 7일
0

코딩테스트

목록 보기
3/3

문제링크: 기능개발 (프로그래머스)

✅ 포인트?

처음엔 변수 ps를 그대로 사용하려고 접근했다.
하지만 실패했고, 구글링을 통해 힌트로 작업일수 를 얻었다.

  • days
    각 작업이 완료되기 위해 필요한 일을 계산했다.
    작업이 완료되기 위해서는 100과 같거나 100을 넘어야한다.
    따라서 반올림함수 math.celi()을 통해 구현했다.

✅ 설명

  • days 계산
    작업이 완료되기까지의 일수 [7, 3, 9] 반환
  • aList 생성
    days를 deque 함수를 통해 큐로 생성
  • tmp 생성
    days의 첫번째 값, days의 나머지 값들과 비교할 용도
  • cnt 생성
    배포할 수 있는 개수 (tmp생성으로 작업개수를 하나 뻈으므로 작업1개가 배포할 수 있다는 가정)
  • answer 생성
    정답을 반환할 리스트

✅ 풀이

from collections import deque
import math

def solution(p, s):
	# p = [93, 30, 55]
    # s = [1, 60, 5]
    
    # 작업이 끝나는 작업일수 = days
    days = [0*i for i in range(len(p))]
    for i in range(len(p)):
        days[i] = math.ceil((100-p[i])/s[i])
    
    aList = deque(days)
    tmp = aList.popleft()
    answer = list()
    cnt = 1
    for _ in range(len(aList)):
        if tmp>=aList[0]:
            cnt += 1
            aList.popleft()
        else:
            tmp = aList.popleft()
            answer.append(cnt)
            cnt = 1
        if len(aList)==0:
            answer.append(cnt)
    return answer

✅ 해석

for _ in range(len(aList)):
        if tmp>=aList[0]:
            cnt += 1
            aList.popleft()
        else:
            tmp = aList.popleft()
            answer.append(cnt)
            cnt = 1
        if len(aList)==0:
            answer.append(cnt)
return answer

if tmp>=aList[0]:
	cnt += 1
    aList.popleft()
  • 현재 tmp엔 첫번째 작업을 마치도록 필요한 작업일수가 들어있음
  • 만약 다음 작업이 마치도록 걸릴 작업일수 aList[0]tmp보다 작다는건
  • aList[0가 바로 배포될 수 있다는 뜻이므로 cnt+=1 한다.
  • 배포가 완료됐으면 aList[0]을 POP 한다.
else:
	tmp = aList.popleft()
	answer.append(cnt)
	cnt = 1
  • 현재 tmp엔 첫번째 작업을 마치도록 필요한 작업일수가 들어있음
  • 만약 다음 작업이 마치도록 걸릴 작업일수 aList[0]tmp보다 크다는건
  • tmp보다 시간이 더 걸린다는 뜻이므로 cnt에 쌓인 작업을 먼저 배포한다.
  • tmp에는 새로운 aList[0] 값을 넣고, cnt를 1로 초기화한다.
	if len(aList)==0:
            answer.append(cnt)
return answer
  • 모든 작업이 끝나고 배포가 아직 안된 작업들cnt을 배포한다.
  • for문이 종료되면 정답리스트 answer를 반환한다.
profile
wannabe---ing

0개의 댓글