Study/백준코테

6. 백준 코딩테스트 2839번 문제 python

코딩 잘 할거얌:) 2021. 9. 23. 16:40
반응형

이번에는 기본 수학 1에 관련된 문제에서 제목이 '설탕 배달'로 되어있는 문제를 풀었다. 정답률이 33%대이다.

https://www.acmicpc.net/problem/2839

 

2839번: 설탕 배달

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

www.acmicpc.net

 

이 문제를 읽어보면 특정 N에 대한 무게가 들어오면 3KG과 5KG으로 나누어서 최소한 배달할 수 있는 개수를 출력하는 문제이다.

 

이 문제를 접근하는 방식이 다양하겠지만, 나는 최솟값을 구하는 것을 중점으로 풀었다. 최솟값을 구하기 위해서는 최대한 많은 양을 5KG으로 나누고 나머지를 3KG으로 나누는 방식으로 접근하려 한다. 즉

 

  1. 5KG으로 모두 옮길 수 있다면 5KG으로 모두 옮긴다. -> N의 값이 5의 배수인 경우에 해당하며 가장 적은 설탕 봉지가 사용된다.
  2. 5KG으로 모두 옮길 수 없다면, 5KG이 가능한 경우에서 하나씩 줄여가며 확인한다. -> N의 값이 5의 배수가 아닌 경우
  3. 5KG은 단 한 번도 쓸 수 없다면, 모두 3KG으로 옮길 수 있는지 확인한다. -> N의 값이 3의 배수인 경우에 해당하며 가장 많은 설탕 봉지가 사용된다.
  4. 모두 안 된다면, -1을 출력한다.

이렇게 문제해결을 해보도록 하자.

 

#무게
receive_kg = int(input())

#무게가 5의 배수 인 경우,
if receive_kg % 5 == 0:
    print(receive_kg // 5)
    #프로그램 종료
    quit()

#무게가 5의 배수가 아니라면,
#무게에서 가장 큰 5의 배수부터 점차 줄여가며 3의 배수로 나누어지는지 확인한다.
for i in range(receive_kg//5, -1, -1):
    remainder = receive_kg - (i * 5)
    if remainder % 3 == 0:
        print(f"{i + (remainder//3)}")
        quit()

#모두 안된다면, -1출력한다.
print("-1")

코드는 다음과 같다.

 

2,3단계는 for문에서 합쳐서 사용한다.

for i in range(receive_kg//5, -1, -1):
    remainder = receive_kg - (i * 5)
    if remainder % 3 == 0:
        print(f"{i + (remainder//3)}")
        quit()
  1. range(a, b, -1)의 경우에는 a에서 b-1까지 1이 감소하는 반복문이다. range(10, 0, -1)이라면 10 9 8... 1까지 반복한다.
  2. 5의 배수가 가장 많이 되는 경우가 가장 적게 설탕 봉지를 옮기는 경우이므로, 5의 배수에서 하나씩 줄여가며 반복한다.
  3. 0이 되는 경우에는 3의 배수인지 체크한다.

성공이다.

다른 분들과 테스트 결과를 비교했을 때, 메모리와 시간차이는 크게 나지 않았다. 그래도 다른 분은 어떻게 작성했는지 확인해 보았다.

 

n = int(input())

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

print(cnt if n >= 0 else -1)

#아이디 'wodltls'분의 제출답안.

다른 분들도 위의 코드와 크게 다를 것이 없었다.

5의 배수로 나누어지지 않으면 3으로 계속해서 빼서 설탕 봉지의 개수를 추가하였고, while문 반복했을 때, n이 남아있는지 확인해서 출력하는 코드를 작성하셨다.

 

좀 더 간단하게 짜는 방법을 생각하도록 해야겠다.

728x90