2839 백준 그리디 : 설탕 배달

gangmin·2022년 1월 2일
0

백준-그리디

목록 보기
1/1

백준

1시간 소요 / X


내 생각

n = int(input())
a, b = 3, 5
result = 0

if n % b == 0 or n % a == 0:
    if n % b == 0:
        result = n // b
        print(result)
    else:
      if (n%b)%a == 0:
        result = n//b + (n%b)//a
        print(result)
      else:
        result = n//a
        print(result)

else:  <----- 여기서 막힘
    if (n % b) % a == 0:
        result = n // b + (n % b) // a
        print(result)
    else:
        print(-1)

너무 당연하게 조건문으로 접근을 했다. 작성을 하면서도 조건문이 너무 복잡해지는것을 느꼈다. 첫번째 조건문에서의 else부분에서 막혔다.

우선 11이 입력되면 11=3+3+5 로 떨어지기 때문에 3이 출력되어야 한다. 그렇지만, 내가 작성한 코드는 11을 5로 먼저 나누고 결국 1이 남아서 -1이 출력된다. if (n % b) % a == 0: 이 부분을 if (n % b) % a == 0 or (n % a) % b: 3으로 먼저 나눈것도 고려한다고 하더라도 11을 3으로 나누면 2가 남아서 또 -1이 출력된다.
---> 나누는 개념으로 접근을 하면 안되는건가? 라는 생각이 들었는데, 나누지 않는다면 어떤식으로 풀어나가야하지?? 에서 막힘 (。_。)

  1. 11같은 경우는 어떻게 설정해주어야 하는가?

풀이

sugar = int(input())
bag = 0
while sugar >= 0 :
    if sugar % 5 == 0 : 
        bag += (sugar // 5) 
        print(bag)
        break
    sugar -= 3  
    bag += 1  
else:
  print(-1)

1) if-else 구문은 알고 있었지만, while-else 처럼 if가 없어도 else를 활용할 수 있는지 몰랐다. else구문은 while조건이 거짓이 되었을 때 실행된다.

  • while sugar >= 0 : // else: 설탕이 음수가 될때 실행이 된다.

    설탕이 음수가 된다. = 3을 계속 빼주더라도 5의 배수가 되지 않는다.

2) sugar -= 3 5의 배수가 될때까지 3을 빼주는while문을 반복한다. 3을 뺀다는 것은 3kg 봉지에 해당하므로 bag += 1 3을 뺄때마다 봉지를 하나씩 늘려간다.

3) 5의 배수가 아니어도 3을 계속 빼다보면 5의 배수에 도달하게 된다. if sugar % 5 == 0 : 설탕이 0이 되어도 이 구문은 0을 출력하므로 실행이 되고, print(bag) 결과를 출력하게 된다.

예시

  • 6 입력 >> 설탕 6-3=3 / 봉지 0+1=1 >> 설탕 3-3=0 / 봉지 1+1=2 >> (설탕이 0이므로 if sugar % 5 == 0 :조건을 충족하여 if 구문 실행) >> 2 출력

  • 4 입력 >> 설탕 4-3=1 / 봉지 0+1=1 >> 설탕 1-3=-2 / 봉지 1+1=2 >> 설탕이 음수이므로 else구문 실행 >> -1 출력

  • 11 입력 >> 설탕 11-3=8 / 봉지 0+1=1 >> 설탕 8-3=5 / 봉지 1+1=2 >> (5의 배수라는 조건을 충족하여 if구문 실행) >> 봉지 2+(5//5)=3 >> 3 출력


결론

이렇게 간단하게 작성이 될 줄은 생각지도 못했다... இ௰இ

나는 나눌 수 있을때까지 최대한 나누는게 우선이라 생각했다. 이런 생각은 11같은 경우를 생각해보면, 잘못된 결과가 나오게된다. 3보다 큰 수인 5로 많이 나누어야 봉지가 "최소"개수에 수렴은 하겠지만, 먼저해야하는 연산은 아니다.

  • 5로 나눈다. (X)
  • 5로 최대한 많이 나눈다. (X)
  • 5로 나눌 수 있는 수 즉, 5의 배수가 될때까지 3을 빼주고 5로 나눈다. (O)

1이 될때까지(-1을 하거나 나누거나)라는 비슷하게 접근하는 문제를 풀어본 적이 있다. 그 문제와 비슷한데, 아예 다르게 접근했다는게 충격적이다....

replit

0개의 댓글