https://www.acmicpc.net/problem/2839
N = int(input())
def sugar_delivery(num):
count = 0
while True:
if num % 5 == 0:
count += num // 5
print(count)
break;
num -= 3
count += 1
if num < 0:
print(-1)
break;
sugar_delivery(N)
전에 풀었구나는 기억했는데, 어떻게 풀었는지는 기억이 나지 않아서 고민을 계속해보았다.
수학식이 가장 먼저 생각났다. 5X+3Y = N 이라는 공식으로하여 X+Y=가 최소값이 되어야하는데 수학식만 생각이났지 어떻게 풀어야할지는 생각나지 않았다. (그래프를 그려야했나 ? ㅋㅎ)
풀이법을 생각해보니
1.처음에 주어지는 N이 5로 나누어 떨어지면 가장 최소값을 가져가는 것이다. 그렇기 때문에 가장 처음 조건에 5로 나눈 나머지가 0이면 그대로 출력하게 했다.
2. 그 다음에 5로 나누어지지 않는 경우는 3으로 나눠야하는데, 어떻게 나눠야할지를 고민하다가 3을 계속해서 빼주면서, count를 해주면 5로 나눌수 있는 숫자가 나올지도 모르겠다고 생각했다. 그래서 3을빼주면 count에 1씩 증가시켜주고, 다시 또 5로 나누어떨어지는 수인지를 검증하는 반복문을 돌려주었다.
3. 3을 계속빼주면서 5로 나누어떨어지지 않고, 3으로 빼주던 수가 0보다 작아진다면, 3과 5로 해결할수없는 무게로 생각하여 -1로 출력처리해주었다.
처음에는 로직을 세분화해서 나누었었는데, 세분화해서 나눈 로직이 하나의 큰 로직으로 해결되는 경우가 있었다. 그리고 무한루프를 먼저 생각하지못했다! 그러니까 코드가 실행이 안되지!
이런 계속해서 나머지와 몫을 가지고 돌아가는 함수는 break문을 꼭 설정해주는 것을 잊지말자
n = int(input())
a = 3
b = 5
if n % 5 == 0:
print(n // 5)
elif n % 5 == 3:
print(int(n%5 + 1))
elif n%5 <= 4 and n%3 ==0:
print(n // 3)
elif n%5 < 3 and n%3 == 2:
print(int(n%5 + n%3))
else:
print(-1)
내가 생각했던 가장 원초적이고 많은 로직들을 생각했던 코드이다. 많은 조건문이 들어가고 가독성이 떨어진다.. 이렇게 작성한 코드가 있었고, 이것을 토대로 리팩토링한 기록을 보았기에 가져와보았다.
기억하자! 세분화 된 로직이 하나의 큰 로직으로 해결될수있음을!