ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 2839번: 설탕 배달
    코딩(Coding)/백준 문제풀이 2021. 1. 18. 10:40
    728x90

    링크: www.acmicpc.net/problem/2839

     

    2839번: 설탕 배달

    상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그

    www.acmicpc.net

    설탕 배달

    문제

    상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다.

    상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다. 예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다.

    상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오.

    입력

    첫째 줄에 N이 주어진다. (3 ≤ N ≤ 5000)

    출력

    상근이가 배달하는 봉지의 최소 개수를 출력한다. 만약, 정확하게 N킬로그램을 만들 수 없다면 -1을 출력한다.


    문제접근

    이번 문제는 수학문제인데, 생각을 많이 했다... 어떤식으로 접근이 맞을까... 하다가! 나머지 연산을 이용해서 5와 3으로 입력 n을 나눴을때 나머지를 고려해서 풀면 될거 같았다.

     

    우선 입력 n을 받고 5로 나누고 n을 그 나머지로 갱신한다. 왜냐면 5가 3보다 더 크기때문에 5kg봉지로 더 많이 담는다면, 최소봉지 수가 더 줄어들 것이다. 그리고 갱신된 n을 3으로 나눈다. 그 다음 n을 나머지로 갱신한다. 3으로 나누었기 때문에 n은 0,1,2 3가지 경우가 남는다.

    여기서 0일 경우에는 정확하게 나누어 떨어진 것이므로 5와 3으로 나눈 그 몫을 합쳐서 반환하였다.

    그리고 1일 경우에는 5kg봉지 하나를 풀어서 나머지 1과 더해준다. 그렇다면 설탕은 6이 남는데 이를 다시 3kg봉지 2개에 담으면 된다.

    마지막 2일 경우는 5kg봉지 2개를 풀어서 나머지 2와 더해준다. 그러면 설탕은 2+10이 남으므로 3kg봉지 4개로 담긴다.

     

    위처럼 알고리즘을 설계했고 문제를 풀 당시에는 저 방법밖에 없는거 같았다...(?)


    코드

    """
    백준 알고리즘 2839번: 설탕배달 
    https://www.acmicpc.net/problem/2839
    """
    import sys
    
    def calc(n):
        # 정확하게 설탕을 담을 수 없는 경우는
        # -1로 예외처리 함
        if(n<3 or n == 4 or n == 7):
            return -1
    
        # 우선 5로 나눠서 5kg 봉지의 개수를 셈
        cnt5 = int(n/5)
        n = n%5 # 나머지 계산도 해줌
    
        # 이제 3으로 나눠서 3kg 봉지의 개수를 셈
        cnt3 = int(n/3)
        rema3 = n%3 # 그 나머지도 계산 해줌
    
        # 5로 나누고 3으로 나눴을때 나머지가
        # 0,1,2가 있는데 각자에 대한 처리
        if(rema3 == 0):
            # 나머지가 0일 경우 정확하게 떨어진 경우이므로 그냥 반환
            return cnt5+cnt3
        elif(rema3 == 1):
            # 나머지가 1인 경우 5kg보지를 하나 풀어서 1+5를 3kg봉지 2개로 만듦
            return (cnt5-1) + (cnt3+2)
        elif(rema3 == 2):
            # 나머지가 2인 경우 5kg 봉지를 2개 풀어서 2+10를 3kg봉지 4개로 만듦
            return (cnt5-2) + (cnt3+4)
    
    def main():
        n = sys.stdin.readline()
        n = int(n)
        print(calc(n))
    
    if __name__ == "__main__":
        main()

    주석을 확인하면서 코드를 읽으면 이해가 잘 될것 같다.

    728x90

    '코딩(Coding) > 백준 문제풀이' 카테고리의 다른 글

    [백준] 1049번: 기타줄  (0) 2021.01.22
    [백준] 14584번: 암호 해독  (0) 2021.01.20
    [백준] 10870번: 피보나치 수 5  (0) 2021.01.12
    [백준] 1912번: 연속합  (0) 2021.01.12
    [백준] 2004번: 조합 0의 개수  (0) 2021.01.11

    댓글

Designed by black7375.