For Programmer

백준 2839번 파이썬 문제풀이(기본수학1 - 설탕배달) 본문

코팅테스트/백준 문제 모음

백준 2839번 파이썬 문제풀이(기본수학1 - 설탕배달)

유지광이 2021. 9. 10. 15:21
728x90

나의 코드 (이중 반복문 이용)

n = int(input())
count = [] #개수를 담기 위한 봉지의 개수

for i in range((n // 5) + 1): #입력 최대값 5000을 만들 수 있는 5kg그램만 사용할 때의 최대 반복 횟수범위
    for j in range((n // 3) + 2): #입력 최대값 5000을 만들 수 있는 3kg그램만 사용할 때의 최대 반복 횟수범위
        if n == 5 * i + 3 * j: # 입력한 값과 5kg 사용 개수와 3kg 사용 개수의 합이 같을 때
            count.append(i+j) #해당 값(봉지의 개수)를 count 배열에 넣어 준다.

if len(count) == 0: #만약 만들 수 있는 개수의 조합이 없다면
   print(-1) #-1 출력
else: #있다면
    print(min(count)) #해당 개수의 최소값 출력

-> 이중반복문으로 풀었다. 사실 이중반복문을 사용하는 것은 크게 좋은 방법은 아니다. 시간복잡도가 굉장히 높아지기 때문이다. 문제에서 n의 범위값을 5000으로 제한했기 때문에 푸는데 지장은 없었다. 하지만 정답코드가 굉장히 간결하고 깔끔하기 때문에 다음과 같이 풀기를 바란다.

 

n = int(input())

count = 0

while n >= 0:  # n>=0보다 크거나 같다면
    if n % 5 == 0:  # n이 5로나누어 떨어지면
        count += (n // 5)  # n을 5로 나눈 몫을 count에 더해준다
        print(count)  # count 출력
        break  # 반복문 빠져나온다. else문 실행 x
    n -= 3 # n이 5로 나누어 떨지지 않으면 3만큼 빼준다.
    count += 1 #개수에 한번 더해준다.
else: #n이 0보다 작고 위의 while문에서 반복문을 break로 빠져나오지 못했다면(itreable이 소진되었을 경우)
    print(-1) #-1출력

-> 이 코드의 핵심은 n을 계속 3씩 빼주는 것이다. 즉, 5로 나누어 떨어지지 않으면 계속해서 3씩 빼주고 3씩 뺏을때 5로나누어 떨어지는지를 확인한다. 그래도 안나누어 떨어지고 n이 0보다 작을 경우 while ~ else문을 통해 -1을 출력하게끔 한다. 

728x90
Comments