[프로그래머스] LEVEL2 기능개발 (Python)

Loopy·2021년 7월 5일
2

프로그래머스

목록 보기
7/32
post-thumbnail

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


🧐 문제 설명


😍 나의 풀이

문제가 결과적으로 가장 왼쪽의 원소가 100이 될 때까지 더하고 100이 되면 리스트에서 빠져나오기 때문에(배포) 덱 자료구조를 사용했다. 연속해서 100이 완료되서 나오는 경우가 문제의 핵심이므로 while문과 조건문을 사용해서 100이상인 것은 전부 popleft()하고 아닐 경우에 count를 출력하고 다시 더했다. 한가지 애먹은 부분은 덱의 원소가 아무것도 없게 되서 IndexError를 유도하거나 아래 코드의 경우는 while 문을 벗어나버려서 마지막 count가 출력되지 않는 문제점이었다. 그래서 결과값이 return 되기 전 마지막 요소까지 출력했다.

if not p_deq and count != 0:    
       answer.append(count)
from collections import deque

def solution(progresses, speeds):
    p_deq = deque(progresses)
    s_deq = deque(speeds)
    count = 0
    answer = []
    
    while p_deq:
        this = p_deq.popleft()
        if this >= 100: # 가장 왼쪽의 원소가 100이상이면 계속 popleft하면서 count 증가시킴
            count += 1
            s_deq.popleft()
            
        else:   # 아닌 경우 다시 가장 왼쪽에 집어넣고 count값이 있는 애들은 배포 
            p_deq.appendleft(this) 
            
            if count != 0:
                answer.append(count)
                
            p_deq = deque([x+y for x,y in zip(p_deq, s_deq)])
            count = 0
    
    if not p_deq and count != 0:    # 마지막 경우에 p_deq에 원소가 없어서 count를 append하는 while안에 else문이 진행X 경우 
        answer.append(count)
    
    return answer

👏 다른 사람의 풀이

내가 겪은 IndexError 문제는 try-except 문으로 처리했고 math 라이브러리를 사용해 ceil로 100이 되기 전까지 남은 횟수를 리스트로 만들어 접근했다. 아예 접근한 알고리즘 자체가 시작부터 달랐던 거 같아서 흥미있게 봤다ㅋㅋ

from math import ceil

def solution(progresses, speeds):
    daysLeft = list(map(lambda x: (ceil((100 - progresses[x]) / speeds[x])), range(len(progresses))))
    count = 1
    retList = []

    for i in range(len(daysLeft)):
        try:
            if daysLeft[i] < daysLeft[i + 1]:
                retList.append(count)
                count = 1
            else:
                daysLeft[i + 1] = daysLeft[i]
                count += 1
        except IndexError:
            retList.append(count)

    return retList

🥇 Today I Learn

반올림, 내림, 올림

올림 - ceil

import math #math 모듈을 먼저 import해야 한다.
>>> math.ceil(-3.14)    #결과는 -3
>>> math.ceil(3.14) #결과는 4

내림 - floor

import math
>>> math.floor(3.14)    #결과는 3
>>> math.floor(-3.14)   #결과는 -4

반올림 - round

round(3.1415, 2)   #결과는 3.14

원래 두 개의 인자를 받는데 두 번째 인자가 생략되면 소수 첫째 자리에서 반올림한다

리스트에 map 사용

  • list(map(함수, 리스트))

  • tuple(map(함수, 튜플))

  • 리스트, 튜플 뿐만 아니라 모든 반복 가능한 객체를 넣을 수 있음

>>> a = list(map(str, range(10)))
>>> a
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
profile
공부 쫌 해!!!😂

0개의 댓글