CodeUp 3120 : 리모컨

hjchoi·2022년 5월 1일
0

coding-test

목록 보기
3/5

문제 설명

컴퓨터실에서 수업 중인 정보 선생님은 냉난방기의 온도를 조절하려고 한다.
냉난방기가 멀리 있어서 리모컨으로 조작하려고 하는데, 리모컨의 온도 조절 버튼은 다음과 같다.

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 )

출력

최소한의 버튼 사용으로 목표온도가 되는 버튼의 횟수를 출력한다.

입력 예시

7 34

출력 예시

5

도움말

10도 -> 10도 -> 5도 -> 1도 -> 1도

문제풀이

참고: https://swblossom.tistory.com/59

전체 코드

t1, t2= map(int,input().split())

absVal = abs(t1 - t2)

result = 0
result += absVal // 10

rmdVal = absVal % 10
if rmdVal == 1 or rmdVal == 5:
    result += 1
elif rmdVal == 2 or rmdVal == 4 or rmdVal == 6 or rmdVal == 9:
    result += 2
elif rmdVal == 3 or rmdVal == 7 or rmdVal == 8:
    result += 3

print(result)

리모컨 횟수의 계산을 편하게 하기 위해선 우리가 현재온도와 목표온도 간의 차이를 절대값으로 구해줘야 한다.

absVal = abs(t1 - t2)

쉽게 생각하면 우리가 리모컨 조작으로 구해야 할 온도이다.
그 후 해당 값을 10으로 나눈 몫을 구해준다. 이 값은 온도를 10도 올리는 횟수이다.

result += absVal // 10

그리고 나머지 값에 대해 처리하는 로직을 태워준다.

rmdVal = absVal % 10
if rmdVal == 1 or rmdVal == 5:
    result += 1
elif rmdVal == 2 or rmdVal == 4 or rmdVal == 6 or rmdVal == 9:
    result += 2
elif rmdVal == 3 or rmdVal == 7 or rmdVal == 8:
    result += 3

제일 헷갈렸던 부분이 이부분인데, 설명을 듣고나니 이해가 가는 로직이었다.
각각 버튼을 누르는 가장 최소 횟수를 계산해주면 된다.
간단히 설명하면 다음과 같다.

  • 1도를 올리기 위해선 1도 버튼 한번 누르면 된다. (1회) (이하 +숫자로 표현)
  • 2도를 올리기 위해선 +1 +1 하면 된다. (2회)
  • 3도를 올리기 위해선 +1 +1 +1 또는 +5 -1 -1 하면 된다. (3회)
  • 4도를 올리기 위해선 +5 -1 하면 된다. (2회)
  • 5도를 올리기 위해선 +5 하면 된다. (1회)
  • 6도를 올리기 위해선 +5 +1 하면 된다. (2회)
  • 7도를 올리기 위해선 +5 +1 +1 하면 된다. (3회)
  • 8도를 올리기 위해선 +10 -1 -1 하면 된다. (3회)
  • 9도를 올리기 위해선 +10 -1 하면 된다 (2회)

횟수 별로 정리하자면 위에서 구한 나머지 값(rmdVal)이 아래 횟수에 해당한다.
1회: 1, 5
2회: 2, 4, 6, 9
3회: 3, 7, 8

즉 최종 리모컨을 조작 한 횟수는

(우리가 구해야 할 온도값 // 10) + 나머지 값에 해당하는 회수

이다.

문제 회고

풀다가 도저히 풀지 못해 다른사람들의 해결법을 참고했다.
문제 난이도는 그렇게 어려워 보이지 않았는데 생각보다 어려웠던 문제라고 생각한다.
그리디 문제를 거의 안풀어봐서 그런걸지도 모르겠지만..

나는 온도를 올리거나 혹은 내리는 단방향 케이스에만 맞춰서 코딩을 진행했었다.
하지만 문제는 온도를 맞추기 위해서 온도를 올리거나 내릴수 있다는 것이다.
그걸 가장 잘 보여준 케이스가 현재온도 22도 목표온도 3도인 문제였다..

22도의 경우 10도로 2번 내리고 1도만 올려주면 최소 횟수로 온도를 맞출 수 있다. (22-10-10+1)
하지만 내 코드로 해당 케이스를 테스트해보면 2도에서 다시 5도를 올렸다가 그상태에서 1도씩 온도를 내려 총 6회의 횟수가 나왔다.
해당 케이스를 기준으로 잡아 한 3시간 열심히 코드를 수정해봤지만...
결국 포기하고 다른사람들의 풀이를 참고해봤다.

막상 문제 풀이를 보고나니
절대값으로 구할 온도를 구하는게 첫번째,
그리고 그 수를 가장 큰 수인 10으로 나눈 몫에다가 나머지 값에 따른 횟수를 더해주는게 두번째 핵심이었다.
보면서 좀 더 수학적인 생각과 규칙을 찾아내는게 필요하겠구나 라는걸 느낀 문제였다.

profile
개발 잘하고 싶다...!

0개의 댓글