Baekjoon 2839 설탕 배달

배혜진·2023년 1월 28일

Baekjoon Class 2

목록 보기
6/7

[문제]


[풀이]

3과 5를 가지고 수를 구성하는데, 가장 적은 수로 만들기 위해서는 5를 최대한 많이 사용해야한다.

수가 주어졌을 때, 3,6,9,12처럼 바로 나누어떨어지는 경우를 제외하고 나머지가 5보다 작을때까지 계속해서 입력받은 수에서 5를 빼준다.

만약 이 수가 바로 3으로 나누어 떨어진다면 남은 3의 개수를 세주면 되는데, 그렇지 않다면 5를 더하고 다시 한 번 3으로 나누어떨어지는가를 본다.

이 과정을 지속하다 처음 입력한 수와 같은 수가 돼버린다면, 만들 수 없는 수로, -1을 출력해준다.

그리고 총 수를 출력해주면 된다.

[최종코드]

num=int(input())
x=num
cnt=0
idx=1


while(idx) :
    if(num==3):
        break
    if(num==6):
        break
    if(num==9):
        break
    if(num==12):
        break
        
    cnt=cnt+1
    num=num-5
    if(num<5):
        idx=0
idx=1

msg=0

while (idx):
    if(num%3==0):
        idx=0
        while(num):
            num=num-3
            cnt=cnt+1
        break
    num=num+5
    cnt=cnt-1
    if(num==x):
        idx=0
        msg=-1

if(msg!=-1):
    print(cnt)

elif(msg==-1):
    print(msg)

[돌아보며]

코드 너무너무 길다
그래서 다른 사람들 코드를 참고해봤다 !

n = int(input())
print(-(n in [4, 7]) or n-2*n//5*2)

이건 아직 잘 모르겠다..

n = int(input())
cnt = 0

if n % 5 == 0:
    print(n // 5)
else:
    while True:
        if n - 5 < 0 and n - 3 < 0:
            print(-1)
            break
        else:
            n -= 3
            cnt += 1
            if n % 5 == 0:
                print(cnt + (n // 5))
                break

일단, 5로 나누어떨어지면 바로 출력하면 된다.
그렇지 않다면, n은 3을 빼고 그 횟수를 cnt로 카운팅한다. 그리고 만약 5로 나누어 떨어질 때, 3의 횟수와 5로 나눈 몫을 더해 출력하면 된다.
이 과정을 반복했는데도 나누어떨어지지 않는다면 가능한 경우가 없는 것. 그러므로 -1을 출력한다.

내 코드는 최대한 5를 빼준다음에 다시 올라오는 형식으로 카운팅하는 것인데,
이 코드는 처음 숫자에서 3을 빼가면서 내려가는 형식으로 카운팅하는 것이다.

확실히 내가 처음에 짠 코드보다 이게 더 효율적인 듯 ! (if로 예외처리 해줄 필요가 없어성..)

profile
HYU🦁 Information System 22✨

0개의 댓글