본문 바로가기
Beakjun_Solve

#백준 #2839_설탕배달 #파이썬 #수학 #그리디

by CodingStriker 2024. 3. 3.
반응형

문제 : https://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을 출력한다.

예제 입력 1 복사

18

예제 출력 1 복사

4

 

풀이 :

N = int(input())  # 설탕의 무게 입력

# 5킬로그램 봉지로 최대한 채우기 위해 5로 나눈 몫을 구함
bag_count = N // 5

# 남은 설탕의 무게를 구함
remainder = N % 5

# 5킬로그램 봉지로 채울 수 없는 나머지가 3의 배수이면서 3킬로그램 봉지로 채울 수 있는 경우
if remainder % 3 == 0:
    # 3킬로그램 봉지로 필요한 개수를 더함
    bag_count += remainder // 3
    print(bag_count)
else:
    # 5킬로그램 봉지를 줄여가며 조건을 확인
    while bag_count > 0:
        # 5킬로그램 봉지를 하나씩 줄이면서 나머지를 확인
        bag_count -= 1
        remainder += 5
        # 만약 나머지가 3의 배수이면서 3킬로그램 봉지로 채울 수 있는 경우
        if remainder % 3 == 0:
            # 3킬로그램 봉지로 필요한 개수를 더함
            bag_count += remainder // 3
            print(bag_count)
            break
    # 봉지로 설탕을 정확하게 N킬로그램 만들 수 없는 경우
    else:
        print(-1)

이런 그리디 알고리즘 문제는 지금 당장의 최적의 해를 구할 때 다음 최적의 해를 구할 때 아무런 영향이 없는 경우에 쓸 수 있는 알고리즘이다. 즉 예를 들어 서울에서 인천을 거치고 부산을 가야하는데, 서울에서 인천까지 가는 최단 거리를 골라도, 인천에서 부산까지 가는데 최단 거리에 아무런 영향을 주지 않는다는 것이다. 문제를 잘 이해하고 어떤 접근법으로 가야하는지 잘 생각해야한다. 또한 하나하나 루트를 잘 생각해서 최적의 해를 구할 수 있도록 해야한다.

#2839 code

위의 코드를 요약한 코드이다. 첫번째 코드와 접근법과 푸는 방식은 똑같다. 하지만 이렇게 컴퓨터 처리 구조를 이해하면서 더 짧고 간결한 코드를 짤 수 있다.

 

반응형