Algorithm/프로그래머스

세무민의 코딩일기 : 프로그래머스 기능개발 문제 풀기! [deque() 사용하기]

세기루민 2021. 2. 5. 20:01
728x90

흠... 최근에 알고리즘을 공부하면서

이력서도 조금씩 쓰고 있는 중입니다. 

그러다가 좋은 기회가 생겨서 코딩 테스트를 볼 예정인데......

프로그래머스에서 시험을 본다고 하네요 ㅠㅠ 

근데 사실 프로그래머스를 해본적이 없어서......

급하게 오늘부터 시작했습니다....

(시험은 내일인데 슈벌...ㅠㅠ)


일단 프로그래머스 문제가 개인적으로는 어려운거 같네요 ㅠㅠ 

뭔가 파이썬 코드로는 완벽하게 돌아가는거 같아도....

숨겨진 테스트 코드에 통과하지 못하는 경우도 종종 발생합니다 ㅠㅠ 


오늘 푼 문제는 이문제!

이 문제를 보면 딱 바로 생각나는건??

queue!


문제를 요약해보면!

progresses : 현재 완료한 수치

speed : 하루 당 가능한 진도 수 

즉! progresses와 speed를 이용해서 100%를 채우면 됩니다. 

return : 기능 배포 묶음

여기서 결국 남은 진도수를 구한 후 몇일 걸리는지 결과를 도출한다면 문제는 쉽게 풀 수 있습니다.

그래서 사용한 공식은!

result = int((100- aprogresses) / speeds)

위의 공식처럼 구한다면 결국 result에는 횟수만 남겠죠?

그렇다면 횟수끼리 묶어주면 끝! 

# 첫번째 접근 방법 

prog = deque(progresses)
speed = deque(speeds)
maxResult = []
numberSum = 100
tmp = 0
result = []


for i in range(len(progresses)):
    a = prog.popleft()
    b = speed.popleft()
      if int((numberSum - a) % b) == 0: 
         tmp = int((numberSum - a) / b)
      else:
         tmp = int((numberSum - a) / b) + 1

    maxResult.append(tmp)
     
 number = 1
 maxSize = maxResult[0]
 for i in range(1, len(maxResult)):
     print("maxsize  : ",  maxSize, maxResult[i])
     if maxSize > maxResult[i]:
         number += 1
         maxSize = maxSize - maxResult[i]
     else:
         result.append(number)
         number = 1
          
     if i == (len(maxResult) - 1):
         result.append(number)   
        
 print(result)    

위의 공식 그대로 구현을 해봤는데 

결론은 위의 코드는 테스트 코드에 적합하지 못했습니다. 

거이 스케치 하는 것처럼 구현했는데 

말 그대로 남은 횟수를 구한 후 남은 횟수를 비교해서 

전에 값이 다음 값보다 크다면 카운트를 증가시키고 그렇지 않다면 number라는 값을 리스트에 넣는 방식으로 했으나....

코드 실행에선 문제가 없지만 채점에서는 오류 투성이...ㄷㄷ

그래서 곰곰히 고민했는데....

maxSize를 생성한다면 경우의 수에 속하지 않는 값도 존재한다는 걸 느끼고 수정~ 

# 두번째 수정
from collections import deque
import math
prog = deque(progresses)
speed = deque(speeds)
maxResult = []
numberSum = 100
tmp = 0
result = []


for i in range(len(progresses)):
    a = prog.popleft()
    b = speed.popleft()
    tmp = math.ceil(numberSum - a) / b
    maxResult.append(tmp)
    

    
number = 1
# maxSize = maxResult[0]
for i in range(len(maxResult)):
    try:
        if maxResult[i] < maxResult[i + 1]:
            result.append(number)
            number = 1
        else:
            maxResult[i + 1] = maxResult[i]
            number += 1
            
    except IndexError:
        result.append(number)
        
print(result)    
    

우선 인덱스 값에 대한 오류가 발생한다면! 즉 리스트에 마지막인 경우 number를 추가하고 

그 전까지는 값을 비교하면서 number를 증가시켜줍니다. 

리스트에서 i번째가 i+1번째보다 작다면 기존 number를 리스트에 추가해줍니다. 

그리고 기존에 maxResult를 생성하는 과정에서 굳이 if문을 만들지 않구 math.ceil라는 함수를 이용해서 

결과 값을 자동으로 반올림 하여 간편하게 구현했으나.....

이 또한 제출 시 테스트 케이스 1개에 걸려서 ㅎㅎ

마지막 수정..ㅎㅎ

아마 반복문으로 배열에 받는것보다 lambda 함수를 이용해서 받는 것이 더 효율적이라 그런지 

테스트 케이스는 통과했는데...

사실 상 의문이 조금 들긴한다 ㅠㅠ 

그래도 우선 맞았으니 패스~ 


다음에도 다른 알고리즘 풀이 문제로 찾아오겠습니다~ 

 

728x90