본문 바로가기

알고리즘

[그리디] 백준 10162번 전자레인지 Python 풀이

728x90
반응형

문제 요약

버튼 3개가 달린 전자레인지가 있다. A, B, C 버튼은 각각 5분, 1분, 10초의 시간이 지정되어 있어 한번 누를 때마다 그 시간이 동작 시간에 더해진다.

냉동음식마다 전자레인지로 조리할 시간 T가 초단위로 표기되어 있다. 우리는 A, B, C 버튼을 적절히 눌러 시간의 합이 정확히 T초가 되도록 해야한다. 단, 버튼을 누른 횟수의 합은 항상 최소값이어야 한다.

(예: 요리시간(T)이 100초라면 B 버튼 1번, C 버튼 4번을 누르는 것. C 10번은 시간은 맞지만 최소 횟수가 아니므로 안됨)

백준 10162번 문제 바로가기

입력

첫 번째 줄에는 요리시간 T(초)가 정수로 주어져 있으며 그 범위는 1 ≤ T ≤ 10,000 이다.

출력

여러분은 T초를 위한 최소버튼 조작의 A B C 횟수를 첫 줄에 차례대로 출력해야 한다. 각각의 횟수 사이에는 빈 칸을 둔다. 해당 버튼을 누르지 않는 경우에는 숫자 0을 출력해야한다. 만일 제시된 3개의 버튼으로 T초를 맞출 수 없으면 음수 -1을 첫 줄에 출력해야 한다.

입출력 예시

입력 출력
100 0 1 4
189 -1

작성 코드

정답 예시 1

import sys

# 필요한 변수 선언 및 값 입력받기
T = int(sys.stdin.readline())
A, B, C = 300, 60, 10
A_count, B_count, C_count = 0, 0, 0

# A, B, C 버튼 클릭 횟수 구하기
if T // A > 0:
    A_count = T // A
    T %= A
if T // B > 0:
    B_count = T // B
    T %= B
if T // C > 0:
    C_count = T // C
    T %= C
# 위 동작 결과에 따라 출력
if T == 0:
    print(A_count, B_count, C_count)
else:
    print(-1)

정답 예시 2-(1)

A, B, C를 변수 처리 했을 경우(아래 코드)

A, B, C 변수 처리 대신 10, 30, 500 그대로 사용했을 경우

import sys

T = int(sys.stdin.readline())
A, B, C = 300, 60, 10
A_count, B_count, C_count = 0, 0, 0

# T가 C버튼으로 나누어 떨어지지 않는 경우 -1 출력
if T % C != 0:
    print(-1)
# 나누어 떨어질 경우, 각 버튼 클릭 횟수 구한 뒤 출력
else:
    if T // A > 0:
        A_count = T // A
        T %= A
    if T // B > 0:
        B_count = T // B
        T %= B
    if T // C > 0:
        C_count = T // C
        T %= C
    print(A_count, B_count, C_count)

정답 예시 2-(2)

import sys

T = int(sys.stdin.readline())
A, B, C = 0, 0, 0

if T % 10 != 0:
    print(-1)
else:
    if T // 300 > 0:
        A = T // 300
        T %= 300
    if T // 60 > 0:
        B = T // 60
        T %= 60
    if T // 10 > 0:
        C = T // 10
        T %= 10
    print(A, B, C)

피드백

작성 코드에 주석을 달아 놓은 것으로 설명이 충분할 정도로 어렵지 않은 문제였다. 간만에 간단하게 풀 수 있는 문제라 좋았다.

 

추가로, 문득 동작 속도에 대한 궁금한 점이 생겨 테스트를 했다.

  • if문을 다 따로 작성하는 것(정답 예시 1)과 if문 안에 if문으로 작성하는 것(정답 예시 2))

정답 예시 1

  • 값을 변수에 넣어서 동작하는 것(정답 예시 2-(1))과 넣지 않고 숫자값 그대로 동작하는 것(정답 예시 2-(2))

정답 예시 2-(1) : 변수에 넣음
정답 예시 2-(2) : 변수 처리 대신 값 그대로 사용

변수에 값을 저장해두고 해당 변수로 접근하는 것은 값을 직접 접근하여 사용하는 것보다 시간이 더 걸리지 않을까?

if문을 이중 작성(정답예시 2)하면 -1이 나와야 할 때 일일이 계산하지 않아도 되니까 모든 if문을 거쳐야 하는 경우(정답예시 1)보다 시간이 더 적게 걸리지 않을까? 하는 궁금증에서 테스트를 해봤다.

유의미한 차이는 없는 것으로 보인다. 동작 시간 체크를 동일한 파이참에서 동일한 테스트 케이스를 가지고 했다면 결과가 달랐을 수도 있지만, 간단하게 궁금증을 해소하고 싶었기 때문에 이쯤에서 마무리

메모리 사용량이나 시간은 큰 차이가 없지만, 코드 길이에서 차이가 나는 것으로 생각하면 되겠다.

 

728x90
반응형