본문 바로가기
Algorithm/프로그래머스

[프로그래머스] [Python] Level2_기능개발

by 은세라 2021. 8. 3.

https://programmers.co.kr/learn/courses/30/lessons/42586

 

코딩테스트 연습 - 기능개발

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는

programmers.co.kr

 

- 반환 순서에 집착하면 Stack / Queue문제이다

- 업데이트 되는 값을 꼭 다 저장할 필요는 없다

- While은 조건이 True일 때, 실행의 반복이다 조건문이 아니다

 

def solution(progresses, speeds):
    answer = []
    cnt = 0
    #FIFO -> stack
    while(progresses):
        if progresses[0] >= 100:
            progresses.pop(0)
            speeds.pop(0)
            cnt+=1
        else:
            #아직 100이 안된거라 진도율 더하기
            for i in range(len(progresses)):
                progresses[i] += speeds[i]
            #100된거 없으니 pop된거 있나
            if cnt != 0:
                answer.append(cnt)
                cnt = 0
    #마지막에 if문 걸린건 else문을 안타서 append 한번 더
    answer.append(cnt)
    return answer

0.  progresses와 speeds를 각각 stack으로 생각하기

1. progress가 남아있는 동안

  1-1. 가장 위에 있는 것이 100보다 크면

    1-1-1. cnt++

    1-1-2. progress랑 speed 둘 다 pop

  1-2. 아직 100보다 안크면

    1-2-1. 하나씩 각자 speed만큼 더해주기

    1-2-2. cnt가 0이 아니면 1-1로직에서 100보다 컸다는 뜻이니 answer에 append 후에 cnt 초기화


1차 시도 - Fail

def solution(progresses, speeds):
    answer = []
    stack = []
    speed_rvs = []
    cnt = 0
    
    for i in range(len(progresses)):
        stack.append(progresses[len(progresses)-1-i])
    for i in range(len(speeds)):
        speed_rvs.append(speeds[len(speeds)-1-i])

    while len(stack) > 0:
        if stack[-1] >= 100:
            cnt += 1
            stack.pop()
            speed_rvs.pop()   
        else: 
            for i in range(len(stack)):
                stack[i] += speed_rvs[i]
            
        if cnt != 0: answer.append(cnt)
        cnt = 0
                     
    return answer

cnt를 더해주는 부분이랑 초기화해주는 부분 위치를 잘못찾았다.

2차 시도

def solution(progresses, speeds):
    answer = []
    stack = []
    speed_rvs = []
    cnt = 0
    
    for i in range(len(progresses)):
        stack.append(progresses[len(progresses)-1-i])
    for i in range(len(speeds)):
        speed_rvs.append(speeds[len(speeds)-1-i])

    while len(stack) > 0:
        if stack[-1] >= 100:
            cnt += 1
            stack.pop()
            speed_rvs.pop()   
        else: 
            for i in range(len(stack)):
                stack[i] += speed_rvs[i]
            if cnt != 0: 
                answer.append(cnt)
                cnt = 0
        
    answer.append(cnt)                    
    return answer

위치를 찾아서 Pass

다른 사람들 풀이를 보니 stack의 pop을 꼭 맨 뒤의 것이 아니라 인자를 줘서 특정 index부터 pop이 가능함을 알게됨

그래서 reverse해서 굳이굳이 stack 배열을 만든 것을 수정

3차 시도 - 최종 제출

def solution(progresses, speeds):
    answer = []
    cnt = 0

    while len(progresses) > 0:
        if progresses[0] >= 100:
            cnt += 1
            progresses.pop(0)
            speeds.pop(0)   
        else: 
            for i in range(len(progresses)):
                progresses[i] += speeds[i]
            if cnt != 0: 
                answer.append(cnt)
                cnt = 0
        
    answer.append(cnt)                    
    return answer

0.  progresses와 speeds를 각각 stack으로 생각하기

1. progress가 남아있는 동안

  1-1. 가장 위에 있는 것이 100보다 크면

    1-1-1. cnt++

    1-1-2. progress랑 speed 둘 다 pop

  1-2. 아직 100보다 안크면

    1-2-1. 하나씩 각자 speed만큼 더해주기

    1-2-2. cnt가 0이 아니면 1-1로직에서 100보다 컸다는 뜻이니 answer에 append 후에 cnt 초기화

4차 시도

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

    while len(progresses) > 0:
        if (progresses[0]+speed[i]*time)>= 100: #검사
            cnt += 1
            progresses.pop(0)
            speeds.pop(0)   
        else: #덧셈처리(time)
            if cnt != 0: 
                answer.append(cnt)
                cnt = 0
            time += 1
   
    answer.append(cnt)                    
    return answer

더해주는 것을 꼭  list에 업데이트 시킬 필요X

대신 time변수를 새로 선언해줘서 몇번 speed를 더해줘야하는지 계산

 

 

댓글