Code up : 3120 (그리디 알고리즘, 백트래킹)

sosimeow·2022년 5월 31일
0

코딩 테스트

목록 보기
1/2
post-thumbnail

Code up : 3120 풀이

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))

np.abs 주석을 그대로 두고 제출시 수행 시간:170 ms / 메모리 :157,796 kb 가 나왔습니다

이에 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문을 쓰지 않고도 충분히 가능해서 조건문 만으로 코드를 짰는데 수행시간에는 별 차이도 없을 뿐더러 반복문을 쓴 풀이가 수행시간을 단축해 의아(?)했다

두 코드의 차이는 while 문 사용 외에는 10으로 나눈 몫과 나머지를 구하는 line 과 5로 나눈 나머지 line 정도인데 line수가 더 많아서 약간 지체되었는지 정확한 원인은 사실 잘 모르겠다. 1초 차이에 메모리는 같아서 큰 차이는 아닌듯(?) 하다.

혹시 이 원인을 아시는 알고리즘 고수 분은 알려주시면 너무 감사할 것 같다 ..!

또 그리디 알고리즘으로 분류되어 있는데, 흔히 풀던 그리디 문제는 아닌 것 같다. 하위 분류인 백트래킹에 더 가까운 문제라고 느꼈다.

결론은 while문 써서 더 간결한 코드를 만들도록 하자!

profile
데이터 엔지니어 ing

0개의 댓글