저고데

[프로그래머스]마법의 엘리베이터 본문

프로그래머스

[프로그래머스]마법의 엘리베이터

진철 2023. 2. 14. 23:33
728x90
반응형

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/148653

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

코드를 작성하기 위한 순서는 다음과 같다.

1. 각 자리의 숫자를 구해준다.

2. 각 자리 숫자가 0에 가까우면(5 미만) 그 값만큼 빼줘서 0으로 만들고, 10에 가까우면(5 초과) 10에 부족한 만큼 더해줘서 10으로 만들고 그 다음 자릿수에 1을 더해준다.

3. 5일 때가 가장 까다로운데, 다음 자릿 수를 신경써서 더할 지 뺄 지를 결정해야한다. 만약 다음 자릿 수에 1을 더했을 때, 5 이상이면 더하는 것이 최소이므로 더해주고, 5 미만이면 빼는 것이 최소이므로 빼준다.

4. 999의 경우, 모든 작업을 완료하면 res=[0, 0, 10]이 될 것이다. 따라서 끝 자리가 10일 때는 1로 바꿔줘서 계산한다.

5. 모든 작업을 완료했을 때, 600이 되었다면 마지막 자릿 수도 올림하여 1000을 만들어주는 것이 최소로 만들 수 있다. 따라서 첫번째 자리 숫자가 5 초과라면(5일 경우에는 올림하는 방법이 최소가 아니다.) 숫자를 올려서 4번을 실행한 후 리스트의 마지막 원소를 반환한다.

 

def solution(storey):
    answer = 0
    res = [] #1번 : 각 자리수를 담을 리스트
    num = storey
    while num >= 1: #1번
        res.append(num%10)
        num //= 10
    for i in range(len(res)-1):
        if res[i] < 5: #2번
            answer += res[i]
            res[i] = 0
        elif res[i] > 5: #2번
            answer += 10-res[i]
            res[i+1] += 1
            res[i] = 0
        else: #3번
            if res[i+1] >= 5:
                answer += 10-res[i]
                res[i+1] += 1
                res[i] = 0
            else:
                answer += res[i]
                res[i] = 0
    if res[-1] == 10: #4번
        answer += 1
        return answer
    elif res[-1] > 5: #5번
        answer += 10-res[-1]
        res[-1] = 10
    else:
        answer += res[-1]
    if res[-1] == 10: #5번
        answer += 1
    return answer

 

5일 때를 신경쓰는 것이 이 문제의 핵심이었다.

그 뿐만 아니라, 여러 반례를 신경써서 각 조건에 맞는 코드를 작성하는 것도 좋은 방법이었던 것 같다.

어떤 문제든지, 학문적인 측면에서 증명하는 것이 좋은 방법이지만 예시(반례)를 사용하여 증명하는 것도 꽤나 매력적인 방법같다.

728x90
반응형