https://codeup.kr/problem.php?id=3120
위의 문제를 푼 2 가지 방법의 풀이를 게시합니다.
변수 정의
- fea_gap : 목표 온도와 현재 온도간의 차이
- push_no : 10도, 5도, 1도 버튼을 누르는 총 횟수
- rest : 버튼을 누른 후 남은 온도 (나머지 개념, 1번 풀이에만 존재)
- 첫 번째 풀이는 fea_gap 의 갱신 없이, +-10버튼을 누른 후 나머지 정보만으로 push_no 구합니다.
- 두 번째 풀이는 fea_gap을 갱신 하며, 매 loop 마다 push_no을 업데이트 합니다.
## 1. 조건문 풀이
import sys
import numpy as np
def remote_control(a, b):
push_no = 0
fea_gap = np.abs(b - a)
'''
# np.abs 대체 코드:
if a > b:
a, b = b, a
fea_gap = b - a
'''
# +- 10 버튼 누르는 횟수
push_no += fea_gap // 10
rest = fea_gap % 10
if rest >= 8:
# +- 10 버튼 한 번 더
push_no += 1
# +- 1 남은 온도
push_no += 10 - rest
elif rest >= 5:
# +- 5 버튼 (rest: 5, 6, 7 일 때)
push_no += 1
rest = rest % 5
# +- 1 남은 온도
push_no += rest
elif rest == 4:
# +-5 and -+1
push_no += 2
else:
# rest : 1, 2, 3 일 때
push_no += rest
return push_no
if __name__ == '__main__':
a, b = map(int, input().split())
print(remote_control(a, b))
이에 numpy 호출 없이 사칙연산으로 fea_gap 을 구하는 코드로 변경한 결과
수행 시간: 20ms / 메모리 : 27,724 kb 가 나옵니다
그냥 흔히 썼던 numpy를 코테에서는 되도록이면 사용하지 않으면 좋은 것인지 .. 이 내용은 좀 더 찾아보아야 할 것 같습니다.
## 2. while 문 풀이 : 수행 시간:19 ms / 메모리 :27,724 kb
def remote_control(a, b):
push_no = 0
if a > b:
a, b = b, a
fea_gap = b - a
while True:
if fea_gap == 0:
return push_no
elif fea_gap >= 8:
fea_gap -= 10
elif fea_gap >= 4: # fea_gap 3부터는 +-1버튼을 누르는 것과 동일 또는 더 적은 비용
fea_gap -= 5
elif fea_gap >= 1:
fea_gap -= 1
elif fea_gap < 0:
fea_gap *= -1
push_no -= 1 # 음수를 양수로 바꾸는 과정은 버튼 push에 해당되지 않으므로 뒤에서 더하는 +=1 을 미리 차감
push_no += 1
if __name__ == '__main__':
a, b = map(int, input().split())
print(remote_control(a, b))
두 코드의 차이는 while 문 사용 외에는 10으로 나눈 몫과 나머지를 구하는 line 과 5로 나눈 나머지 line 정도인데 line수가 더 많아서 약간 지체되었는지 정확한 원인은 사실 잘 모르겠다. 1초 차이에 메모리는 같아서 큰 차이는 아닌듯(?) 하다.
혹시 이 원인을 아시는 알고리즘 고수 분은 알려주시면 너무 감사할 것 같다 ..!
또 그리디 알고리즘으로 분류되어 있는데, 흔히 풀던 그리디 문제는 아닌 것 같다. 하위 분류인 백트래킹에 더 가까운 문제라고 느꼈다.
결론은 while문 써서 더 간결한 코드를 만들도록 하자!