[파이썬] 프로그래머스 LV1 콜라문제📍

청수동햄주먹·2023년 2월 7일
0

파이썬코딩테스트

목록 보기
9/35

프로그래머스 콜라문제

이런 다항식을 만드는 문제는 Lv0 에서도 비슷한 문제가 있었는데 단순한것 같으면서도 상당히 헷갈린다. 그래도 이번엔 수월하게 했는데 테스트때도 당황 하지 않고 잘 해내려면 좀더 연습이 필요할 것 같다

첫 제출

def solution(a, b, n):
    ans = (n // a) * b 
    total = (n // a) * b + n % a

    while(True):
        ans += (total // a) * b
        total = (total // a) * b + total % a
        if(total < a): break
    return ans

ans에는 빈 콜라병으로 얻은 콜라를 누적해서 쌓아준다.
total은 남아있는 빈병의 수로 처음 n값을 이용해서 초기값을 설정해주고
그 이후부터 while loop 으로 a(바꾸주는 빈병 수:unit)보다 total의 값이 작아 더이상 콜라를 더 얻을 수 없을 때 빠져나오게 된다.

보완

def solution(a, b, n):
    ans = (n // a) * b 
    total = (n // a) * b + n % a

    while(total >= a):
        now = (total // a) * b
        ans += now
        total = now + total % a
    return ans

두가지를 고쳐보았다.
1. while(total >= a)으로 바꿔서 break를위한 if조건문을 안써도 됨
2. now = (total // a) * b 라는 지역변수 만들어주기
이 계산을 두번 반복하게 되어서 아예 그 값을 now에 저장하고 두번 사용하게 하였다

다른 사람의 풀이

solution = lambda a, b, n: (n - b) // (a - b) * b
  • lambda a,b,n : 콜라 n개를 사서 빈 병 a개를 가져다주면 콜라 b병을 주는 마트.
    1 ≤ b < a ≤ n
  • (n - b) : 초기값, n개를 사서 b 병을 받게됨. 결국 n-b를 사게 되는 셈이다.
  • // (a - b) : 그 비율은 a병을 갖다주면 b를 받게 되므로 a-b의 비율로 받게 된다고 할 수 있다.
  • (n - b) // (a - b) : 초기값 // 빈병수거?율 -> 몇번을 돌려 받을 수 있는지 알게 된다
    a가 항상 b보다 크므로 분모가 0이 되지 않음
  • * b : 한번에 돌려받는 갯수를 곱해서 결국 몇개를 돌려 받는지 알게 된다.

성능 비교

첫 제출보완한줄 코딩
테스트 1 〉통과 (0.01ms, 10.3MB)통과 (0.01ms, 10.1MB)통과 (0.00ms, 10.1MB)
테스트 2 〉통과 (0.00ms, 10.1MB)통과 (0.00ms, 10.2MB)통과 (0.00ms, 10MB)
테스트 3 〉통과 (0.01ms, 10.2MB)통과 (0.01ms, 10.3MB)통과 (0.00ms, 10.2MB)
테스트 4 〉통과 (0.00ms, 10.1MB)통과 (0.00ms, 10.1MB)통과 (0.00ms, 10.2MB)
테스트 5 〉통과 (0.00ms, 10.3MB)통과 (0.00ms, 10.1MB)통과 (0.00ms, 10.1MB)
테스트 6 〉통과 (0.00ms, 10MB)통과 (0.00ms, 10.1MB)통과 (0.00ms, 9.96MB)
테스트 7 〉통과 (0.00ms, 10.1MB)통과 (0.00ms, 9.99MB)통과 (0.00ms, 10.1MB)
테스트 8 〉통과 (0.00ms, 10.2MB)통과 (0.00ms, 9.92MB)통과 (0.00ms, 10.1MB)
테스트 9 〉통과 (0.00ms, 10.2MB)통과 (0.00ms, 10.1MB)통과 (0.00ms, 10.1MB)
테스트 10 〉통과 (0.00ms, 10.1MB)통과 (0.00ms, 10.3MB)통과 (0.00ms, 10MB)
테스트 11 〉통과 (0.00ms, 10.3MB)통과 (0.00ms, 9.93MB)통과 (0.00ms, 10MB)
테스트 12 〉통과 (0.46ms, 10.3MB)통과 (0.32ms, 10.1MB)통과 (0.00ms, 10.2MB)
테스트 13 〉통과 (0.00ms, 10.3MB)통과 (0.00ms, 10.2MB)통과 (0.00ms, 10.2MB)
테스트 14 〉통과 (0.00ms, 10.2MB)통과 (0.00ms, 10.1MB)통과 (0.00ms, 10.1MB)
  • 확실히 같은 계산을 두번하지않게 해준 보완코드가 더빠르고 메모리도 더 적게쓰는 것을 확인하였다.
  • 수만 알면 어떤 값이 나오는지 수학적으로 확인해서 나온 한줄코드는 확실히 빠름.. 특히 테스트 12번!
  • 이렇게 다항식으로 나오는 문제는 수학적으로 한줄만에 답을 얻을 수 있는지 좀더 고민해 봐야겠다
profile
코딩과 사별까지

0개의 댓글