Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

우주에서 글을 적어본다

99클럽 코테 스터디 23일차 TIL + 그리디(Greedy) 본문

항해99 TIL

99클럽 코테 스터디 23일차 TIL + 그리디(Greedy)

우주로 날아간 사람 2024. 8. 13. 22:37

[오늘의 학습 키워드 및 문제]
- 프로그래머스의 "마법의 엘리베이터" 문제를 풀었다.
- 그리디 알고리즘을 활용하여 푸는 문제다.
- 민수는 엘리베이터를 만들 게 아니라 마법 빗자루를 쓰는 슬기로움을 발휘하도록 하자.

[나의 코드]

def solution(storey):
    answer = 0
    
    while storey:
        remainder = storey % 10
        
        if (remainder == 5 and storey // 10 % 10 >= 5) or remainder > 5:
            storey += 10 - remainder
            answer += 10 - remainder
        else:
            answer += remainder
        storey //= 10
        
    return answer

일단 내가 처음에 쓴 코드에 다른 사람이 예쁘게 쓴 코드를 참고하여 예쁘게 바꿔서 작성했다.
더티 코드 장인으로서 한마디 덧붙이자면 역시 예쁜 코드가 이해하기에도 좋다.

storey를 10으로 나누는 이유가장 오른쪽 자릿수를 추출하고, 다음 자릿수로 이동하기 위해서이다.
16 % 10 = 6 ← 일의 자리부터 구할 수 있다.

세 가지 경우로 나눌 수 있다.
① 나머지가 5보다 큰 경우 → 더하는 게 더 빠르다.
② 나머지가 5인데 그다음 자릿수가 5 이상인 경우
③ 나머지가 5보다 작은 경우 → 빼는 게 더 빠르다.

문제는 2번이다. 이것도 45와 55를 비교해 보면 된다.

44 % 10 = 4 44 // 10 = 4 빼는 게 더 빠름
55 % 10 = 5 55 // 10 = 5 더하는 게 더 빠름

그래서 1, 2번은 같은 경우로 처리하고 나머지는 3번과 같이 처리하면 정답이 된다.
그리고 마지막에 storey //= 10을 잊지 말아야 한다. 

[오늘의 회고]
- 주어진 테스트 케이스를 분석하면 나머지를 어떻게 이용해야 할지 쉽게 구할 수 있다.
- 이런 거는 비슷한 문제를 더 풀거나 복습을 더 해야겠다.
- 오늘은 왜 이렇게 졸렵니.... 끝!