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이 결과값으로 나온다.
하지만, 실제로는 51 + 3*3 이 올바른 값이다.
즉. 5로 나눴을 때의 값(2) 보다 작은 num_5 값(1)을 고려하지 못한다.
[해결방법]
따라서, 만약 5로 나눴을 때의 큰 값(2)의 나머지값(4)로 만약 3이 나누어지지 않으면,
num_5의 값을 줄이면서, 나머지 값이 3으로 나누어지는지 확인해야한다.
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으로 나누어지는지 확인을 해본다.
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
(n%5) // 3
이 부분은 너무 당연하므로 가볍게 넘어가겠습니다.
(n%5) % 3
5로 나눈 나머지, 그러니까, "n을 5로 최대로 나눌 수 있을만큼 나누고 남은것!"을,
3으로 또 나누고 남은 나머지를 의미한다.
위의 switch-case문에서 Return 값을 살펴봤을 때,
(n%5)%3 + (n%5)//3 하면 값이 똑같당.
사실 나도 잘 이해하지 못했다.
이 부분은 좀 찾아보고 알아보고 해보도록 할게용...