[프로그래머스 level 2] 기능개발 - 파이썬(Python)

hyngsk·2021년 4월 16일
0

프로그래머스

목록 보기
1/1

해결 방안

개발 진도([97, 98, 95, 94, 96])와 개발 속도([1, 1, 1, 1, 1])의 입력이 각각 주어졌다고 가정하면
개발에 남은 일 수는 [3, 2, 5, 6, 4]일 일것이다. 그렇다면 배포 할 때 포함하는 프로젝트 는[2, 1, 2] 일 것이다.

첫번째 개발 이 3일 걸리는데 그 다음인 2일 걸리는 프로젝트는 첫 번째 3일짜리 프로젝트가 끝날 때 같이 배포 된다는 문제에서 나는 다음과 같은 방안을 생각해 냈다.

첫번 째 3일짜리 프로젝트가 시작된다.
-> 3일짜리 프로젝트, 결과 배열에 1을 추가하고 다음으로 넘어간다.( 결과 : [1], idx = 1 )
-> 2일짜리 프로젝트다. 첫 번째인 3일짜리 프로젝트보다 일찍 끝나므로 이전 프로젝트 배포시 같이 배포한다.( 결과[idx - 1] += 1 -> 결과: [2] )
-> 5일짜리 프로젝트다. 이전에 가장 오래걸리는 3일짜리 프로젝트는 이미 배포했으니 결과 배열에 다시 1을 추가하고 다음으로 넘어간다.( 결과 : [2, 1], idx = 2 )
-> 6일짜리 프로젝트는 더 오래 걸린다. ( 결과 : [2, 1, 1], idx = 3 )
-> 1일짜리 또한 6일짜리 배포 시 같이 배포한다. ( 결과[idx - 1] += 1 -> 결과: [2, 1, 2] )

코드

def solution(progresses, speeds):
    answer = []
    time = []
    remain = []

    for i in progresses:
    '''
    걸리는 시간을 계산한다.
    '''
    	time.append(100 - i)
    print(time)
    
    for i in range(len(progresses)):
    '''
    걸리는 시간에서 개발 속도를 나눈 나머지가 있으면 +1일 아니면 그 날로,
    개발에 걸리는 날 수를 저장한다.
    '''
    	#오류났던 부분[1]
        remain.append((time[i] // speeds[i]) + 1 if time[i] % speeds[i] > 0 else time[i] // speeds[i])
    print(remain)
    
    prev = 0
    idx = 0
    for day in remain:
        if day > prev:
            answer.append(1)
            idx +=1
            prev = day
            print(day)
        else:
            answer[idx-1]+=1
            print('기다려야함',next_remain)
        print(f'prev = {prev}, day = {day}, idx = {idx}')
    print(f'리턴값 : {answer}')
    
    return answer

오류의 해결

제출 시 테스트 케이스 마지막인 11번을 하나를 제외한 나머지 10개는 통과하였는데
오류났던부분[1]의 상황은 다음과 같았다.
오류의 원인은 개발 진도는 90%, 속도는 4% 일 때,
남은 진도/속도의 몫은 2지만 나머지가 0.5 이다.
오류났던부분[1]의 코드는 2일이 걸린다고 말해준다.
하지만 남은 시간이 있을 때 하루를 추가해줘야 한다는 조건을 간과하였다.

# 오류 코드
remain.append(time[i] // speeds[i])

# 통과 코드
remain.append((time[i] // speeds[i]) + 1 if time[i] % speeds[i] > 0 else time[i] // speeds[i])

0개의 댓글