머신러닝 개발자의 러닝머신

[프로그래머스-마법의 엘리베이터] (Python) 본문

알고리즘/프로그래머스

[프로그래머스-마법의 엘리베이터] (Python)

oongsong 2023. 4. 12. 22:54
반응형

문제링크

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

유형 

  • 관찰 & 규칙찾기

아이디어

  • 올림을 하면 하나 커진 윗자리를 다시 0으로 만들기 위해 횟수가 +1 추가되지만
    내림을 수행하는 것보다 올림을 수행하는 횟수가 2보다 작으므로 올림이 더 유리함 (따라서, 6이상인 경우는 무조건 올림이 유리함)
  • 그렇지 않은 4보다 작거나 같은 경우는 내림이 무조건 유리함 
  • 5인 경우는 윗자리 수에 따라 내림이 유리한 경우, 올림이 유리한 경우가 달라짐 

 

문제 풀이

  1. 일의 자리 숫자부터 확인하면서 5보다 작으면 내림, 5보다 크면 올림, 5인 경우는 그 윗자리에 따라 올림 or 내림 여부 달라짐 
    - 5인 경우, 윗자리 숫자가 5보다 크거나 같으면 올림, 윗자리 숫자가 5보다 작으면 내림
  2. 올림을 수행하는 경우, 윗자리가 9면 0이 되고 다시 윗자리 수로 올림이 일어나기 때문에 윗자리가 9가 아닐 때까지 올림을 수행한다. 
    (윗자리가 없는데 올리는 경우는 queue 에 popleft 로 윗자리수 1추가해준다)-> 이것 때문에 큐 사용 

 

코드 

from collections import deque 
def solution(storey):
    answer = 0
    
    storey = str(storey)
    n = len(storey)
    lst = deque([int(storey[i]) for i in range(n)])
    while lst:
        num = lst.pop()
        if num==0:
            continue 
        if num>=6: #올림 
            answer += 10-num 
            if not lst: #앞지리 수가 없는 경우 1추가(올림한 새로운 자리 수)
                lst.appendleft(1)
                continue 
            for j in range(len(lst)-1, -1, -1): #9가 아닌 수까지 올림 수행, 올릴 자리 없으면 1추가하여 올림해준다
                if lst[j] == 9:
                    lst[j] = 0 
                    if j ==0:
                        lst.appendleft(1)
                        break  
                else:
                    lst[j]+= 1 #9가 아닌 수에 올림 수행, break 
                    break
                    
        elif num ==5: #앞자리 수 보고 판단하기 
            answer += 5
            if not lst: #윗자리 수가 없으면 고려 x
                break 
            if lst[-1]>=5: #윗자리 수가 5보다 크거나 같으면 올림/내림은 그냥 answer += 5 이미 갱신했으므로 더 고려 안해도 됨  
                for j in range(len(lst)-1, -1, -1):
                    if lst[j]==9:
                        lst[j] = 0 
                        if j ==0:
                            lst.appendleft(1)
                            break  
                        continue 
                    else:
                        lst[j]+= 1
                        break 
                
        else: #5보다 작으면 무조건 내림 
            answer += num 
    
    return answer

 

반응형