콜라문제

문종후·2023년 4월 11일

노션에다가 공부한이유 벨로그를 잘안쓰기시작하긴하네..
오늘 간단하게 재귀함수배운김에 프로그래머스 lv1문제중에 간단한 콜라문제를 재귀함수로 표현해보는연습을좀해보고 넘어가도록하겠다.

문제

한 마트에서는 빈 병 a개를 가져다가 주면 콜라 b병을 줍니다. 이 때 빈 병 n개를 마트에 가져다주었을 때 콜라 몇 병을 받을 수 있는지 계산하세요. 빈 병이 a개 미만인 경우에 더 이상 콜라를 받을 수 없습니다. (예시: a가 3, b가 1, n이 20이라고 가정했을 때, 빈 병 3개를 가져다주면, 콜라 1병을 받습니다. 처음에는 빈 병 3개당 콜라 1개를 받을 수 있으므로 빈 병 18개를 가져다주면 콜라 6병을 받게 됩니다. 그리고 콜라 6병을 모두 마셨다고 가정합니다. 그러면 현재까지 남아 있는 콜라는 총 (2+6) = 8병이 되고 콜라 8병에서 이제 6병을 가져다주면 콜라 2병을 받게 됩니다. 이제 2+2 = 4병이 남게 되며 여기에서 3병을 가져다가 1병을 받으면 총 1+1 = 2병이 남게 됩니다. 3병당 1병을 새로 받으므로 더 이상 받을 수 없습니다. 결론적으로 받은 콜라의 병 개수는 6+2+1 = 9개입니다)

사고방식

어우 문제 읽으니까 오히려못풀겟네 그냥 간단하게말하면 빈병을가지고 콜라를얻고 그 콜라를 다마시면 그콜라가또 빈병이되니 그걸로또 공짜콜라를 얻어먹겟다는 도둑놈심보를 잘 활용해보자. 근데 콜라중독자인 나는 저런 가게잇으면 개꿀이긴하겠다.

아무래도 처음이니까 그냥 한번손으로써봣다. 구조를 살펴보면 재귀적인게살짝보이나?

맨처음 빈병을 a로나눠준후 -> 그몫에다가 b를곱해준다.그러면 그몫xb가된것이 다시 빈병이되어 다시 똑같은함수에들어가게된다.

function solution(a, b, n) {
  let 니가먹은콜라가대체뭐야=0
  if(n<a){
      return 니가먹은콜라가대체뭐야
  }
  //남은콜라의개수가 줘야되는병보다 적으면 당연히 콜라는 국물도없다.
  //근데사실 그냥 return 을 0으로하는게이쁘다.
 
  let 동냥하듯얻은콜라=Math.floor(n/a)*b
  //얻은콜라를 구하는방법은 몫을 구하는 Math.floor로 무자비하게 나머지를 잘라버리자
  return 동냥하듯얻은콜라+solution(a,b,(n%a)+동냥하듯얻은콜라)
  //근데 사실 나머지는 필요하다 왜(?)->그거에 동냥하듯얻은콜라 더해서 또 콜라를먹을수도있거든
  //최종코드는 요런식으로 짜주면된다.
}
profile
개발자가되고싶은사람

0개의 댓글