멋쟁이v의 개발일지

[백준 10162번] 전자레인지(파이썬) 본문

0년차/알고리즘(그리디)

[백준 10162번] 전자레인지(파이썬)

멋쟁이v 2022. 11. 16. 21:28
728x90
320x100
문제
3개의 시간조절용 버튼 A B C가 달린 전자레인지가 있다. 각 버튼마다 일정한 시간이 지정되어 있어 해당 버튼을 한번 누를 때마다 그 시간이 동작시간에 더해진다. 버튼 A, B, C에 지정된 시간은 각각 5분, 1분, 10초이다.

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

만일 요리시간이 100초라고 하면(T=100) B를 1번, C는 4번 누르면 된다. 이와 다르게 C를 10번 눌러도 100초가 되지만 이 경우 10번은 최소 횟수가 아니기 때문이 답이 될 수 없다. 이 경우 B 1번, C 4번, 총 5번이 최소버튼 조작이다. 그리고 T=234와 같이 3개의 버튼으로 시간을 정확히 맞출 수 없는 경우도 있다. 

여러분은 주어진 요리시간 T초를 맞추기 위한 최소버튼 조작 방법을 구하는 프로그램을 작성해야 한다. 

 

입력
첫 번째 줄에는 요리시간 T(초)가 정수로 주어져 있으며 그 범위는 1 ≤ T ≤ 10,000 이다. 
출력
여러분은 T초를 위한 최소버튼 조작의 A B C 횟수를 첫 줄에 차례대로 출력해야 한다. 각각의 횟수 사이에는 빈 칸을 둔다. 해당 버튼을 누르지 않는 경우에는 숫자 0을 출력해야한다. 만일 제시된 3개의 버튼으로 T초를 맞출 수 없으면 음수 -1을 첫 줄에 출력해야 한다. 

 

서브테스크
번호 배점 제한
1 30 T ≤ 60
2 30 T ≤ 300
3 40 T ≤ 10,000
예제 입력 1
100
예제 출력 1
0 1 4

 

예제 입력 2
189
예제 출력 2
-1

 


 

풀이
이 문제는 3개의 버튼을 적절히 눌러서 그 시간의 합이 정확히 T초가 되도록 해야 합니다.
그리고 그 버튼을 누른 횟수의 합은 항상 최소가 되어야 하고요.
또한, 합이 정확히 T초가 안될때에는 -1을 출력하도록 합니다.

예제 1
100초가 주어집니다. [ 300초(5분) , 60초(1분), 10초 ]
A 버튼의 횟수(5분) : 300초 // 100초 = 0.xx, 나머지 : 300 % 100 = 300
B 버튼의 횟수(1분) : 60초 // 100초 = 1.xx, 나머지 : 60 % 100 = 40
C 버튼의 횟수(10초) : 40초 // 10초 = 4, 나머지 : 40 % 10 = 0
각 버튼의 횟수 : 0 1 4 / 나머지 : 0

예제 2
189초가 주어집니다. [ 300초(5분) , 60초(1분), 10초 ]
A 버튼의 횟수(5분) : 300초 // 189초 = 0.xx, 나머지 : 300 % 189 = 300
B 버튼의 횟수(1분) : 60초 // 189초 = 3.xx, 나머지 : 60 % 189 = 9
C 버튼의 횟수(10초) : 9초 // 10초 = 0.xx, 나머지 : 9 % 10 = 9
각 버튼의 횟수 : 0 3 0 / 나머지 : 9
3개의 버튼으로 나머지가 0이 되지 않을 때에는 -1

코드를 순서대로 작성한다면
1. 3개의 시간 조절용 버튼 리스트 선언 ( 초로 바꿔서)
2. 버튼을 하나씩 대입해서 몫과 나머지를 구한다.
3. 몫은 각 버튼의 횟수를 출력해야 됨으로 리스트에 저장 후 횟수 초기화
4. 나머지는 처음 주어진 초에 다시 저장
5. 반복 후 나머지가 0이면 몫 출력, 0이 아니면 -1 출력


작성 코드
N = int(input())
time = [300, 60, 10]
answer = [] # 각 버튼의 사용 횟수를 담을 리스트 선언
count = 0 # 각 버튼의 사용 횟수 선언

for i in range(3): # 버튼 개수만큼 반복
    count = N // time[i] # 버튼의 횟수 저장
    answer.append(count) # 버튼의 횟수를 리스트에 차례로 저장
    count = 0 # 횟수 초기화
    N %= time[i] # 나머지를 다시 N에 저장
    
if N == 0: # 나머지가 0일때 각 버튼의 횟수 출력
    print(answer[0], answer[1], answer[2], sep=' ')
else: # 0이 아닐때 -1 출력
    print(-1)
728x90
320x100
Comments