문제 설명
컴퓨터실에서 수업 중인 정보 선생님은 냉난방기의 온도를 조절하려고 한다.
냉난방기가 멀리 있어서 리모컨으로 조작하려고 하는데, 리모컨의 온도 조절 버튼은 다음과 같다.
1) 온도를 1도 올리는 버튼
2) 온도를 1도 내리는 버튼
3) 온도를 5도 올리는 버튼
4) 온도를 5도 내리는 버튼
5) 온도를 10도 올리는 버튼
6) 온도를 10도 내리는 버튼
이와 같이 총 6개의 버튼으로 목표 온도를 조절해야 한다.
현재 설정 온도와 변경하고자하는 목표 온도가 주어지면 이 버튼들을 이용하여 목표 온도로 변경하고자 한다.
이 때 버튼 누름의 최소 횟수를 구하시오.
예를 들어, 7도에서 34도로 변경하는 경우,
7 -> 17 -> 27 -> 32 -> 33 -> 34
이렇게 총 5번 누르면 된다.
입력
현재 온도a 와 목표 온도b가 입력된다. ( 0 <= a , b <= 40 )
출력
최소한의 버튼 사용으로 목표온도가 되는 버튼의 횟수를 출력한다.
입력 예시
출력 예시
문제 풀이
# 현재 온도와 목표 온도 입력받기
a, b = map(int, input().split())
# 에어컨 조절 가능 온도 리스트 만들기
aircon = [10, 5, 1]
# 결과값 초기화
result =
# a와 b의 차의 절댓값을 저장
temp = abs(a-b)
for air in aircon:
# result에 temp를 air로 나눈 몫을 저장
result += temp // air
# temp에서 온도 조절한 만큼 빼주기
temp -= (temp//air)*air
# (예외상황) air와 temp의 차가 1 또는 2인 경우는 temp에서 air를 한번 더 빼는게 더 빠름
if air != 1 and 1 <= air - temp <= 2:
result += 1
# temp에 절댓값을 저장시키기 위해 temp - air가 아닌 air - temp를 저장
temp = air - temp
# 결과값 출력
print(result)
우선 a와 b 중 어떤 값이 크냐에 따라 온도를 올리거나 내려야할지 정해야 하기 때문에 간단하게 a와 b의 차의 절댓값에서 온도를 내려서 0으로 맞춘다고 생각하면 편하다. 위 입력 예시에서 a, b의 값으로 각각 7, 34를 받았으므로 두 수의 절댓값인 27도에서 0도로 내린다고 생각하는 것이다.
이 문제도 거스름돈 문제와 마찬가지로 큰 단위의 온도부터 내리면 되지만, 4도에서 0도로 내리는 경우 1도씩 4번 내리는 것보다 5도를 한번 내리고 1도를 한번 올려서 총 두번만 버튼을 누르는 것이 조작횟수가 더 적다.
이러한 경우가 언제 발생하냐를 따져보면 온도를 내릴 수 있을때까지 내린 후 온도단위와 온도의 차가 1 또는 2일때 나타난다. 위에서 든 예시로 온도 단위 5도와 온도 4도의 차가 1이므로 이러한 경우가 성립하는 것이다. 또 다른 예시로 8도에서 0도로 내리고 싶은 경우, 온도단위 10도와 온도 8도의 차가 2이므로 8도에서 5도를 한번 내리고 1도씩 3번 내려서 총 4번 버튼을 누르는 것보다 10도를 한번 내리고 1도를 두번 올리는 횟수인 3이 더 적다. 물론 온도단위가 1도인 경우에는 성립 안하고 5도와 10도일 때만 성립하기 때문에 예외상황 조건식에 if air != 1 and 1 <= air -temp <= 2를 넣은 것이다.
따라서 이러한 경우에만 당장 내릴 수 있는 온도를 내리는 것보다 더 큰 온도단위를 내리는 것이 빠르므로 예외처리로 빼준 것이다. 그리고 반복문은 현재온도와 목표온도의 온도차의 절댓값을 기준으로 계산하기 때문에 이 경우 temp에 양수값인 air - temp를 저장한 것이다.
'파이썬(Python) > 그리디' 카테고리의 다른 글
코드업(CodeUp) 3321: 최고의 피자 (0) | 2022.06.24 |
---|---|
그리디 알고리즘 이론 (0) | 2022.06.24 |