[백준] 2839번_설탕배달

EunJi·2023년 12월 29일
0

Algorithm

목록 보기
5/5

문제

https://www.acmicpc.net/problem/2839


오답 코드

n = int(input())

def min_sum(n):
    for num_5 in range(n//5, 0, -1):
        temp_n = n - 5*num_5
        if temp_n%3 == 0:
            return (num_5 + temp_n//3)
    return -1

print(min_sum(n))

틀린이유1: python index 역순
Python for문에서 역순으로 하고 싶어 range(n, 0, -1)을 사용하였다.
하지만, num_5 변수가 0까지 되려면 (n, -1, -1)로 해야한다.
.
틀린이유2: 빈례: 14
문제를 살펴보면 3<= n<= 5000 이라는 조건이 존재한다.
위의 코드대로 실행을 시킨다면, 14를 고려했을 때, 52 + 4로, -1이 결과값으로 나온다.
하지만, 실제로는 5
1 + 3*3 이 올바른 값이다.
즉. 5로 나눴을 때의 값(2) 보다 작은 num_5 값(1)을 고려하지 못한다.
[해결방법]
따라서, 만약 5로 나눴을 때의 큰 값(2)의 나머지값(4)로 만약 3이 나누어지지 않으면,
num_5의 값을 줄이면서, 나머지 값이 3으로 나누어지는지 확인해야한다.


정답 코드

방법1

def min_sum(n):
    for num_5 in range(n//5, -1, -1):
        temp_n = n - 5*num_5
        if temp_n%3 == 0:
            return (num_5 + temp_n//3)
    return -1

print(min_sum(n))

[설명]
num_5의 값을 줄여가면서 나머지 값이 3으로 나누어지는지 확인을 해본다.

방법2

def min_sum(n):
    if n in [4, 7]:
        return -1
    else:
        return n//5 + (n%5)%3 + (n%5)//3

print(min_sum(n))

[설명]
방법1 이후에 방법2 코드를 보고서도 이해를 하지 못했었다.
그래서 최대한 쉽게 설명을 해보고자 한다.
5a + 3b = n 이 되어야한다. (코드와는 변수가 다릅니다!)
a = n//5라고 생각해보자.
n%5를 했을 때, 나올 수 있는 값은 0, 1, 2, 3, 4 이다.
python에는 switch case문이 없지만 있다고 생각하고 설명을 해보겠다.

switch (n%5):
	a = n//5
    n
    
	case 0:
    	a = a
        b = 0 // a가 5로 나누어떨어지므로, b는 0이다.
        return a
    case 1:
    	a -= 1
        b = 2 
        // a의 값을 1을 줄임련, 나머지 값은 6이다.
        // 6 = 3*2 이므로, b = 2가 된다.
        return a+1
    case 2:
    	a = a-2
        b = 4
        // a의 값을 2 줄이면, 나머지 값은 12이다.
        // 12 = 3*4이므로, b = 4가 된다.
        return a+2
    case 3:
    	a = a
        b = (n%5) // 3
        return a+ (n%5)//3
    case 4:
    	a = a-1
        b = 3
        // a의 값을 1 줄이면, 나머지 값은 9이다.
        // 9 = 3*3이므로, b = 3이 된다.
        return a+2

하지만, 위의 b값을 보는 것만으로는 잘 모르겠다.
따라서, 조금 나눠봤다. 결과적으로는 아래 코드를 만들어낼 수 있다.

(n%5) % 3 + (n%5) // 3
  1. (n%5) // 3
    이 부분은 너무 당연하므로 가볍게 넘어가겠습니다.

  2. (n%5) % 3
    5로 나눈 나머지, 그러니까, "n을 5로 최대로 나눌 수 있을만큼 나누고 남은것!"을,
    3으로 또 나누고 남은 나머지를 의미한다.
    위의 switch-case문에서 Return 값을 살펴봤을 때,
    (n%5)%3 + (n%5)//3 하면 값이 똑같당.

사실 나도 잘 이해하지 못했다.
이 부분은 좀 찾아보고 알아보고 해보도록 할게용...

profile
말하는 감자

0개의 댓글