PROGRAMMERS - 콜라 문제[Level 1]

GI JUNG·2022년 11월 14일
3

algorithm

목록 보기
6/28
post-thumbnail

이 문제 는 수학적 사고력과 구현을 요구하는 문제같다. 이 문제를 풀었음에도 블로깅을 하는 이유는 다른 풀이(recursive)로 진행하다가 내가 궁금해 했던 문제를 해결했기 때문에 기록으로 남겨두려고 올린다.

일단, 통과한 첫 번째 풀이를 보면 아래와 같아.

🍀 첫 번째 풀이

로직은 아래와 같이 그리 어렵지는 않다.

  • 콜라 빈 병의 총 개수(empty_coca)가 a보다 클 때 아래 1, 2, 3을 실행한다.
    1. 콜라 빈 병을 a로 나눈 몫과 나머지를 구한다.
    2. answer에는 콜라 빈 병(a)를 주었을 때 새 콜라(b)를 주기 때문에 answer에 몫 x b를 누적해서 더해준다.
    3. 다음 루프를 돌기 위해 콜라 빈 병(n; 여기서는 empty_coca)를 갱신시켜준다.
def solution(a, b, n):
    answer = 0
    empty_coca = n

    while empty_coca >= a:
        q, r = divmod(empty_coca, a)
        coca = q * b
        answer += q * b
        empty_coca = coca + r 

    return answer

🍀 다른 풀이

이 풀이는 재귀(recursive)로 구현한 것인데 처음에는 answer를 쓰고 싶지 않았다. answer를 쓰고 싶지 않았다는 것을 풀어서 써 보면 아래와 같다.

🤔🤔🤔 재귀 함수를 계속 돌면 내부에서 선언한 변수는 초기화가 되므로 누적해서 더하거나 유지시키고 싶은 변수는 항상 global에서 선언하여 재귀함수 내부에서 참조하도록 하여 구현했다..

하지만, solution의 인자는 3개로 정해져있으므로 어떻게 할 지 고민했다. 누적해서 값을 유지한 것이 공부한 것 중에 있나 싶었는데 팩토리얼을 그냥 외우다 싶이 했던 것이 생각나 이에 영감을 받아 적용하여 문제를 해결했다!!!🥳🥳🥳
이는 아래 외부 변수 참조 X section에 있다.

외부 변수(answer)를 참조한 풀이

원래 처음 코드는 아래와 같다.

answer를 이용한 코드

answer = 0

def solution(a, b, n):
    global answer
    
    if n < a:
        return answer
             
    q, r = divmod(n, a)
    answer += q * b
             
    return solution(a, b, q * b + r) 

하지만 테케12번에서 오류가 났는데 혹시나 재귀깊이 때문인가 싶어서

재귀 깊이 설정

import sys
  
sys.setrecursionlimit(1000)
  
...//

위의 두 줄을 추가해주면 12번을 통과할 수 있다.
하지만, 이 코드는 global을 자주 참조하게 되면 잠재적 오류를 발생시킬 수 있다고 얼핏 들은 적이 있었어서 global answer자체를 쓰고 싶지 않았다.

외부 변수를 참조하지 않은 풀이

위에서 factorial를 recursive function으로 구현한 것에서 영감을 얻었다고 했다.

먼저 factorial을 구현해보자

def factorial(n):
    if n <= 1: return 1
    
    return n * factorial(n - 1)

위에서 보면 최종으로 factorial의 값을 누적해서 곱해주고 최대 내부까지 들어갔다가 한 단계 위로 계속 누적된 값을 return하여 값을 유지시켜 줌을 볼 수 있다.
이를 이용하여 새로 짠 코드는 아래와 같다.

answer를 이용하지 않은 코드

import sys

sys.setrecursionlimit(10000)

def solution(a, b, n):
    if n < a: return 0
    
    q, r = divmod(n, a)
    
    return q * b + solution(a, b, q * b + r)   # 💡💡💡

모두 통과했다!!! ☁︎🚀

🎉 마치며

이 문제는 궁금증에 의해 시작한 것으로 후에 개발할 때 잠재적인 오류를 최소화하고자 시작했다. 항상 느끼는 거지만 막힐 때 풀어나가며 얻는 성취감에 개발을 공부하지 않나 싶다. 난 오기가 있는 편이라 스스로 풀 수 없는 문제에 시간을 엄청 쏟아서 좌절하는 경우도 있었지만 공부하다가 보면 풀 수 없던 문제들도 쉽게 느껴질 땐 성장한 나를 보며 뿌듯하다.😁

참고

set max recursive max depth

profile
step by step

0개의 댓글