프로그래머스_기능개발

임정민·2023년 10월 24일
0

알고리즘 문제풀이

목록 보기
118/173
post-thumbnail

프로그래머스 Lv2 문제입니다. 실전에 대비하기 위해 60분 시간제한을 두고 풀었습니다.

문제

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

[나의 풀이]

⌛ 27분 소요


def solution(progresses, speeds):

    answer = []

    while progresses:
        
        cnt = 0
        over_100 = True

        for idx,speed in enumerate(speeds):
            progresses[idx] += speed

            if over_100:
                if progresses[idx] >= 100:
                    cnt +=1 
                else:
                    over_100 = False

        progresses = progresses[cnt:]
        speeds = speeds[cnt:]

        if cnt:
            answer.append(cnt)
            
    return answer

Queue 자료구조를 활용하는 문제입니다. 입력된 기능별 진행률 progresses, 하루 기능별 진행률
speeds가 주어지고 순서대로 100% 완료된 기능이 생길때마다 완료된 기능의 갯수를 구하는 문제입니다. 🐱🐱🐱

보통 Queue를 구현할 때는 deque 라이브러리를 활용하여 popleft(), append()를 자주 사용하였습니다. 하지만 위 문제 경우에는 모든 기능별로 하루 진행도를 더해야하는 구조이기 때문에 리스트함축표현식을 사용하기 위해 deque로 큐를 표현하는 대신 인덱스로 접근하여 진행도를 업데이트하고 슬라이싱으로 popleft()를 표현하여 해결하였습니다.

[다른 사람의 풀이1]


import math


def solution(progresses, speeds):
    progresses = [math.ceil((100 - a) / b) for a, b in zip(progresses, speeds)]
    answer = []
    front = 0, 0

    for idx in range(len(progresses)):
        if progresses[idx] > progresses[front]:  
            answer.append(idx - front)
            front = idx 
    answer.append(len(progresses) - front)  

    return answer

수식을 통해 기능별로 100%를 달성하는 일수를 구한뒤 인덱스롤 활용하여 구현한 풀이입니다. 100% 달성 일수를 구하기 위해 math.ceil((100/현재 진행도)/하루 진행도)로 표현한 부분이 간결하고 빠른 속도로 해결할 수 있는 풀이였습니다.🐻‍❄️🐻‍❄️🐻‍❄️

[다른 사람의 풀이2]


def solution(progresses, speeds):
    answer = []
    days = 0 # 날짜 세기
    cnt = 0 # 완료된 기능
    while len(progresses) > 0:
    	# 기능의 진행상황과 그 동안 지난 날짜만큼의 speed를 구해서 더하기
        if(progresses[0]+days*speeds[0])>=100:
            # 완료되면 리스트에서 제거
            progresses.pop(0)
            speeds.pop(0)
            # 완료된 기능 수
            cnt += 1
        else:
        	# 만약 완료된 기능이 있다면 answer에 더해주고 0으로 초기화
            if cnt > 0:
                answer.append(cnt)
                cnt = 0
            # 완료된 기능이 없으면 days 추가
            else:
                days+=1
    answer.append(cnt)
    return answer

진행 일수에 따른 기능별 진행도를 모두 구하는 방식이 아닌 진행 일수에 따른 첫번째 기능의 진행도를 고려하는 방식입니다. 만약 100% 완료된 기능이 있다면 미완료된 기능이 있을 때까지 while문으로 pop()하고 그 갯수를 반환합니다. 반대로 완료된 기능이 없을 시에는 days(진행 일수)를 누적하여 맨 앞단의 기능을 우선적으로 고려하는 알고리즘이었습니다. 전체 기능별 진행도 리스트를 구할 필요가 없는 방식으로 가장 빠른 속도를 보였습니다.🐹🐹🐹

감사합니다.

profile
https://github.com/min731

0개의 댓글