이 문제 는 수학적 사고력과 구현을 요구하는 문제같다. 이 문제를 풀었음에도 블로깅을 하는 이유는 다른 풀이(recursive)로 진행하다가 내가 궁금해 했던 문제를 해결했기 때문에 기록으로 남겨두려고 올린다.
일단, 통과한 첫 번째 풀이를 보면 아래와 같아.
로직은 아래와 같이 그리 어렵지는 않다.
몫 x b
를 누적해서 더해준다.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 = 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) # 💡💡💡
모두 통과했다!!! ☁︎🚀
이 문제는 궁금증에 의해 시작한 것으로 후에 개발할 때 잠재적인 오류를 최소화하고자 시작했다. 항상 느끼는 거지만 막힐 때 풀어나가며 얻는 성취감에 개발을 공부하지 않나 싶다. 난 오기가 있는 편이라 스스로 풀 수 없는 문제에 시간을 엄청 쏟아서 좌절하는 경우도 있었지만 공부하다가 보면 풀 수 없던 문제들도 쉽게 느껴질 땐 성장한 나를 보며 뿌듯하다.😁