밍맹의 생각날 때 적는 블로그

[백준/Python] 2839_설탕 배달 본문

알고리즘(Python)

[백준/Python] 2839_설탕 배달

mingmaeng 2020. 8. 25. 00:16

[문제 링크]

 

2839번: 설탕 배달

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

www.acmicpc.net


오랫만에 알고리즘 문제 하나를 들고 돌아왔습니다. ( 약 2개월... )

바로 시작하죠!

 

흐름은 다음과 같습니다.

 

  • 입력받은 무게 N을 5로 나눈 몫을 5kg 봉지의 개수로 가지고 있는다.
  • N을 5로 나눈 나머지를 3으로 나눈다
  • 나머지가 0이 될 경우 나머지를 3으로 나눈 값을 3kg 봉지의 개수로 가지고 있는다.
  • 나머지가 0이 되지 않을 경우에는 5kg 봉지의 개수를 하나 빼고 나머지 무게에 5kg을 추가한다.
  • 다시 3으로 나누어서 나머지를 확인한다.
  • 위 과정을 반복해서 5kg 봉지가 0이 되었어도 3으로 딱 나누어지지 않는다면 -1을 출력한다.

바로 5로 나누고 시작하는 이유는 더 큰 무게로 나누는 것이 봉지의 개수가 줄기 때문입니다.

코드를 잘게 쪼개서 하나씩 살펴 보도록 하죠.

 

N = int(input())  # 배달해야 하는 킬로그램

three = 0
# 최대 5kg의 개수
five = N // 5

# 남아있는 KG
rest = N % 5

 

three 변수에는 3kg 봉지의 개수를 담을 예정입니다. 현재는 3kg 봉지가 나오지 않았기 때문에 0입니다.

five 변수에는 5kg 봉지의 개수를 담습니다. 입력받은 무게 N을 5로 나눈 몫을 담습니다.

rest 변수는 남아있는 무게를 나타냅니다.

 

if rest != 0:
    for i in range(five, -1, -1):
        if rest % 3 == 0:
            three = rest // 3
            break
        five -= 1
        rest += 5

 

남아있는 무게가 존재한다면 그 무게를 3으로 나눠서 봉지를 만들어야 합니다.

이 때 정확하게 무게가 나뉘어져야 하므로 `if rest % 3 == 0` 조건문을 통해 조건을 확인합니다.

정확하게 떨어진다면 three 변수에 3kg 봉지의 개수를 저장하고 반복문을 종료합니다.

그렇지 않다면 five 변수에 -1을 해주고 rest 변수에 +5를 해준 뒤 다시 반복문에 들어갑니다.

 

result = five + three

 

최종 봉지의 개수를 result 변수에 초기화합니다.

 

if result < 1:
    result = -1
print(result)

 

마지막으로 result의 값은 five + three 입니다. result의 값이 1보다 작다는 소리는 5kg 봉지와 3kg 봉지가 없다라는 뜻입니다.

즉, 정확하게 맞아떨어지지 않는다는 결론이 됩니다. 3과 5로 정확하게 나눌 수 없으므로 result 변수에 -1을 저장합니다.

-1 조건까지 확인하고 최종적으로 result를 출력합니다.

 

전체코드

# 무게 N을 5로 나눈 다음 나머지를 3으로 나눠본다.
# 3으로 나누어진다면 그 개수를 더한 값을 출력한다.
# 3으로 나누어지지 않는다면 5의 개수를 하나 줄여서 위와 같은 진행을 반복한다.
# 최종적으로 5kg 봉투와 3kg 봉투를 모두 더해서 0이 나오면 -1을 출력한다.
N = int(input())  # 배달해야 하는 킬로그램

three = 0
# 최대 5kg의 개수
five = N // 5

# 남아있는 KG
rest = N % 5

if rest != 0:
    for i in range(five, -1, -1):
        if rest % 3 == 0:
            three = rest // 3
            break
        five -= 1
        rest += 5

result = five + three

if result < 1:
    result = -1
print(result)

 


요즘 프로젝트 하느라 바빠서 알고리즘에 손을 놓고 있었는데 가끔씩 이렇게  공부해줄 필요성을 느끼네요...

그리고 아무리 내가 못푼다고 하더라도 끝까지 손 놓지 않고 푸는게 중요하다고 느꼈습니다 ㅎㅎ

Comments