[python_파이썬]백준_2839번_설탕 배달_풀이

2024. 4. 30. 21:32코드리뷰

728x90
반응형

공부하는허딩크 : https://www.youtube.com/live/wAItg8urY5U?feature=shared

 

문제가 짧다. 그래서 만만히 봤다.

처음 문제 소개시 수학적 접근보다 부르트 포스로 푸는게 더 쉽다고 한다.

 

일단 생각하는대로 작성해 보았다.

 

<첫번째 시도 : 실패>

6같은 숫자는 5 + 1 / 3 + 3이 나올 수가 있어, 5 + 1일 경우에는 출력값이 -1이고 3 + 3일 경우에는 출력값이 2이다.

나는 그걸 고려하지 못했다.

import sys
input = sys.stdin.readline

N = int(input())
cnt = 0

while (N > 0):
    if N >= 5:
        cnt += N // 5
        N %= 5
    elif N >= 3:
        cnt += N // 3
        N %= 3
    else:
        cnt = -1
        N = 0
   
print(cnt)

 

역시 실버문제네. 마냥 쉽게 볼 문제가 아니다. 정답률도 37%네.....

 

1시간동안 고민 끝에 그냥 구글링함.

 

내가 왜 이걸 못풀었지...일단 답을 보고 다시 아래와 같이 풀어봤다.

import sys
input = sys.stdin.readline

N = int(input())

cnt = 0

while (N > 1):
    if N % 5 == 0:
        cnt += N // 5
        break
    N -= 3
    cnt += 1
    if N == 1:
        cnt = -1

print(cnt)

 

1. 일단 조건이 N <= 3임으로 1과 2는 무시할 수 있다. 

    조건은 5kg이 우선하고 나머지를 3kg이 만족하면 조건을 만족하고, 아니면 -1을 출력한다.

2. 처음 숫자가 5의 배수이면 3을 고려할 필요가 없다. => 3의 배수를 고려한다면 3과 5의 공통 배수일때 3이 우선시 된다.

   일단 5의 배수 조건을 걸로 cnt = N // 5로 봉지의 개수를 넣자.

   5의 배수면 바로 탈출해야 하니까 break.

3. 5의 배수가 아니라면 N -= 3으로 3키로 봉지를 고려해서 cnt += 1로 봉지를 카운트한다.

    N -= 3을 했는데 5의 배수가 나오면 if조건문에 걸리고, 아니면 다시 N -= 3을 거쳐서 카운트가 된다.

4. 만약 N == 1일 경우 더 이상 while반복이 돌지 않지만, N이 남았기 때문에 봉지로 카운트가 안된다.

    즉, cnt에 모아줬던 봉지를 다시 -1로 바꿔준다.

 

<중요 포인트>

1. 조건이 5kg봉지가 우선함으로 5의 배수가 나오면 무조건 5와 관련한 코드를 생각한다.

2. if다음에 무조건 elif나 else가 나와야 한다고 생각하지 말자. => 초보자에서 넘어가보자.

3. 마지막 if N == 2가 안되는 이유는 N - 3 = 2라면 N은 5가 됨으로 N이 5의 배수라면 위에 if조건에서 cnt가 됨으로 필요없다.

 

코드를 보면 쉬운 문제인데 1시간 동안 생각을 못한 이유가 뭘까???경험 부족으로 생각하고 많이 풀어보자.

 

이정도는 중요포인트만 생각했으면 풀 수 있었을 텐데 아쉽다.

import sys
input = sys.stdin.readline

n = int(input())

if n % 5 == 0:  # 5으로 나눠떨어질 때
    print(n // 5)
else:
    p = 0
    while n > 0:
        n -= 3
        p += 1
        if n % 5 == 0:  # 3kg과 5kg를 조합해서 담을 수 있을 때
            p += n // 5
            print(p)
            break
        elif n == 1 or n == 2:  # 설탕 봉지만으로 나눌 수 없을 때
            print(-1)
            break
        elif n == 0:  # 3으로 나눠떨어질 때
            print(p)
            break

 

728x90
반응형