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

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

상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오.
조건
첫째 줄에 N이 주어진다. (3<=N<=5000)

 


 

  • 코드
# 입력부
sugar=int(input());
tmp=[];

# 처리부
for i in range(1667): #3에 대하여
    for j in range(1001): #5에 대하여
        if(sugar-(3*i)-(5*j)==0):
            tmp.append(i+j);


# 출력부

if(len(tmp)!=0):
    print(min(tmp));
else:
    print(-1);

 


 

  • 여담

어제, 이것이 취업은 위한 코딩테스트다 (with Python)에서 그리디를 공부했다.

관련 문제를 더 풀어보고 싶어서 백준에서 그리드 유형만 모아놓은 문제를 풀기 시작했다.

 

오랜만에 백준을 해서 그런지, input으로 값을 처리하는데 어려움을 겪었다.

보통 input("값을 입력하십시오 ");라고 자주 쓰는데, 백준에선 input안에 글자를 적으면 가차없이 오답처리 해 버린다...

 

결국 돌고돌아 깔끔하지 않은 코드가 나왔다.

 

범위가 5000까지이니,

5000/3=1666.7 이므로, 루프를 1667까지 돌리고, 5000/5=1000이니 1001까지 루프를 돌렸다.

 

그래서 하나씩 대입해서 0이 되는 조건들 중 최솟값을 찾아 반환하는 방식으로 문제를 풀이했다.

그래서 그런지 속도가 놈 느린편이다.

 

지금 이 포스트를 적는 시점에서,

while문으로 처리하고, 5로 나눠준 뒤(// 연산자) 남은 수 만큼 -3씩 해서 -3을 시행한 횟수랑 5로 나눠준 몫을 더하면 더 깔끔하게 풀었을 것 같다는 생각이 든다.

 


 

코드가 이상하거나, 이해 안 되는 부분 있다면 언제든 댓글 남겨주세요!

+ Recent posts