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

김희원·2023년 1월 8일

프로그래머스

목록 보기
5/5
post-thumbnail

📍문제

[프로그래머스] Lv.2 기능개발


✏️ 풀이

✔️ 큐(Queue)

  • 먼저 넣은 데이터를 먼저 반환하도록 설계된 메모리 구조
  • First In Fisrt Out (FIFO)
  • Stack과 반대되는 개념

리스트를 사용하여 큐 구조 구현하기

a = [1, 2, 3, 4, 5]
a.append(10)  # 큐의 put = append()
a.pop()  # 큐의 get = pop(0) -> 맨 앞의 요소가 삭제 및 출력
# pop(0) -> 0번째 요소 삭제 및 출력

💻 CODE

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

✔️ 큐를 사용한 문제 해결 과정

작업 리스트와 개발 속도를 큐라고 생각하고,

  1. progresses가 비었다면 멈춘다.
    1. 배포된 기능의 개수 초기화 (cnt = 0)
    2. proegresses의 맨 앞 작업을 확인한다.
      1. 해당 작업이 완료되었다면(100% 이상) progressesspeeds에서 제거하고 배포된 기능 개수를 증가시킨다. (cnt += 1) -> 3으로 돌아간다
    3. 해당 작업이 완료되지 않았다면(100% 미만) 작업리스트의 진도를 업데이트한다.
    4. 만약 오늘 배포된 기능 개수가 0이 아니라면 결과 리스트에 추가한다. -> 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

✔️ math.ceil()

math.ceil() 함수는 실수를 입력하면 올림하여 정수를 반환하는 함수이다.
ex) math.ceil(3.14) = 4

  1. math.ceil()을 활용하여 소요시간을 각각 구한다.
    progresses = [7, 3, 9]

  2. progresses의 각 소요시간을 확인하는데 이때 front에 가장 오래걸린 소요 시간의 인덱스를 저장해둔다.

  3. idx = 0 : 첫번째 수(7) 보다 첫번째 수 (7) 는 같기 때문에 pass → front = 0

  4. idx = 1 : 첫번째 수(7) 보다 두번째 수 (3) 는 같기 때문에 pass → front = 0

  5. idx = 2 : 첫번째 수(7) 보다 세번째 수(9) 는 크기 때문에 현재 인덱스부터 프론트인덱스의 차를 구하고 이를 answer에 append (그 전까지 친구들은 동시 출시니까) 프론트인덱스를 현재인덱스로 업데이트! → front = 2

  6. 맨 마지막에 현재 프론트인덱스와 전체 길이의 차를 구해서 남은 친구들 다 출시

0개의 댓글