티스토리 뷰

알고리즘

백준 2839 - 파이썬

취뽀가자!! 2024. 1. 25. 01:07

https://www.acmicpc.net/problem/2839

 

2839번: 설탕 배달

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

www.acmicpc.net

문제 풀이

이번 문제는 완전 탐색이면서도 그리디 알고리즘과도 연관될 수 있는 문제이다. 주어진 N kg 설탕을 5kg과 3kg 봉지를 활용하여 가장 적은 봉지 수를 찾는 것이다. 그렇기에 문제를 보자마자 가장 큰 수인 5로 나눠지는 수를 찾는 게 이 문제의 핵심이라고 생각되었다. 처음에 떠올린 알고리즘은 5를 반복문이 종료될 때까지 계속 빼주면서 3으로 나눠지는 수를 찾는 것이었다.

T = int(input())
n = T
sugar_list = []

result = 0
if n % 3 == 0:
    sugar_list.append(n // 3)

for i in range(T):
    n -= 5
    if n <= 0:
        break
    result += 1
    if n % 3 == 0:   
        result += n // 3
        n %= 3
        sugar_list.append(result)

if sugar_list:
    print(min(sugar_list))
else:
    print(-1)

 

3으로 한번에 나눠지는 경우와 5를 하나씩 빼주며 3으로 나눠지는 수를 찾아 리스트에 저장해 주고, 리스트에서 가장 작은 수를 출력하도록 한 코드이다. 하지만 이 코드의 제출 결과는 오답이었다. 반례를 찾아보니 168일 때는 34가 나와야 하는데 54가 나왔기 때문이다. 그래서 다시 고민해 보다가 반대로 3부터 빼면서 5로 나눠지는 수를 찾아보면 어떨까 싶어 코드를 다시 짜 봤다.

 

n = int(input())

if n % 5 == 0:
    print(n // 5)
else:
    result = 0
    while n >= 0:
        n -= 3
        result += 1
        if n % 5 == 0:
            result += n // 5
            print(result)
            break
        elif n == 1 or n == 2:
            print(-1)
            break

 

정답인 코드를 찾았다. 이번에는 5로 한번에 나눠진다면 가장 적은 봉지 수이기 때문에 리스트에 저장하지 않았다. 대신 맨 아래 조건문을 보면 1이나 2가 나온다면 -1을 출력하도록 해놨는데, 이 경우는 3으로 계속해서 뺏는데도 0이 나오지 않고 1이나 2가 나온다는 것은 답을 찾을 수 없다는 뜻이기 때문에 이렇게 작성했다.

 

다른 사람들은 어떻게 풀었나 궁금하여 찾아봣는데 더 간결하게 작성한 이 있어서 가지고 와 봤다.

 

sugar = int(input())

bag = 0
while sugar >= 0 :
    if sugar % 5 == 0 :  # 5의 배수이면
        bag += (sugar // 5)  # 5로 나눈 몫을 구해야 정수가 됨
        print(bag)
        break
    sugar -= 3  
    bag += 1  # 5의 배수가 될 때까지 설탕-3, 봉지+1
else :
    print(-1)

 

이 분 역시 5로 나눠진다면 가장 적은 봉지 수이기 때문에 반복문을 탈출해 주고, 그렇지 않다면 3을 계속 빼주는 식으로 작성하였다.

 

느낀 점

이번 문제 역시 생각을 약간 바꾸는 것으로 부족한 2%를 해결할 수 있었는데, 어느 정도 감이 잡혀 풀이가 진행된 문제는 어떻게 사고의 전환을 조금이라도 더 할 수 있는지에 따라 부족한 2%가 채워지는 것 같다. 또한 문제를 풀어내는데 많은 시간이 소요되었지만 그래도 풀었다는 것에 의의를 둔다. 시간도 단축하고 싶지만 이건 꾸준히 계속 풀어본다면 해결될 문제라고 생각된다.

'알고리즘' 카테고리의 다른 글

백준 18870 - 파이썬  (0) 2024.02.16
백준 1789 - 파이썬  (0) 2024.02.05
백준 1436 - 파이썬  (0) 2024.01.19
백준 1018 - 파이썬  (0) 2024.01.17
백준 19532 - 파이썬  (2) 2024.01.15
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함