level1_콜라문제

2024. 11. 11. 22:20파이썬_알고리즘(코딩테스트)/level1

 

내가 제출한 코드

def solution(a, b, n):
    answer = 0
    while n >= a:
        # 나머지를 반환
        remain_bottle = n % a
        # 마트에서 받은 콜라의 수
        n = (n//a) * b 
        answer += n
        n += remain_bottle
        
    return answer
  • remain_bottle = n % a 
    • n을 a로 나눠주면 마트에서 바꾸지 않은 병이 나온다(remain_bottle)
    • 나머지(%)
  • n = (n//a) * b
    •  n을 a로 나눈 몫을 b(마트가 주는 콜라 병수)랑 곱해주면 마트에서 받은 콜라 수가 나온다.
  • 받은 콜라 수를 answer에 더해준다
  • 이후 남아있는 빈 병을 더해줘서 다음 마트에 갈 때 이용한다. 

다른 사람 풀이1

solution = lambda a, b, n : max( n-b, 0) // (a - b) * b
  • max(n-b,0)
    • n에서 n를 뺀 값이 0보다 작으면 0을 반환하고, 0보다 크거나 같으면 (c-b) 값을 반환한다.
  • (n - b)값을 (a - b)로 나눈 몫을 구한다. 
  • ((c - b) // (a - b)) 결과에 b를 곱해 최종 값을 계산한다.

 

https://blog.naver.com/doctorgu/222992407249

 

프로그래머스 콜라 문제 한줄 코딩 설명

https://school.programmers.co.kr/learn/courses/30/lessons/132267 대부분은 하나씩 빼가며 씀. 그런데 ...

blog.naver.com

참고 ,,, 블로그다... 

다시 봐야겠다...ㅠㅠㅠㅠㅠㅠ 모르겠다.. 이 풀이

 

다른 사람풀이2

def solution(a, b, n):
    answer = 0
    while n >= a:
        answer += (n // a) * b
        n = (n // a) * b + (n % a)
    return answer
  • n >= a일 때 반복한다.
    • 현재 빈 병의 수 n이 교환에 필요한 최소 빈 병의 수 a 이상일 때만 교환 가능하다.
  • answer += (n // a) * b
    • 현재 빈 병 n을 a로 나눠 교환 가능한 횟수를 계산하고
    • 그 횟수에 b를 곱해 받을 수 있는 콜라의 수를 구한다.
  • n = (n / / a) * b + (n % a)
    • 새로 받은 콜라를 마시고 나온 빈 병 (n // a) * b와  기존에 교환하지 못한 나머지 빈 병 n % a를 더하여 새로운 빈 병의 수 n을 갱신한다. 
  • 더 이상 빈 병의 수 n이 a보다 작아서 교환이 불가능해지면 반복문을 종료하고, answer를 반환하여 총 얻은 콜라의 개수를 출력한다. 

내가 제출한 풀이랑 비슷한거 같다.