본문 바로가기

코딩

[파이썬] 마법의 엘리베이터 - 프로그래머스 코딩테스트 연습

반응형

마법의 돌을 아끼기 위해 민수는 항상 최소한의 버튼을 눌러서 이동하려고 합니다.

1부터 예를 들어봅시다.

 

1층에 있다면 -1을 1만큼 사용합니다.

2층에 있다면 -1을 2만큼 사용합니다.

3층에 있다면 -1을 3만큼 사용합니다.

4층에 있다면 -1을 4만큼 사용합니다.

5층에 있다면 -1을 5만큼 사용합니다.

 

6층에 있다면 1을 4만큼 사용하여 10층으로 간 뒤 -10을 하나 사용하여 총 5번만 사용할 수 있습니다.

7층에 있다면 1을 3만큼 사용하여 10층으로 간 뒤 -10을 1만큼 사용하여 총 4번만 사용할 수 있습니다.

같은 이유로, 8층은 3번, 9층은 2번만 사용하면 됩니다.

 

10층에 있는 경우 -10을 한 번만 사용합니다.

11부터 14까지는 -10 한 번과 -1을 각각 해당하는 수만큼 사용하여 2, 3, 4, 5만큼 사용할 수 있습니다.

15 또한 -10 한 번과 -1을 5번 사용하여 6만에 내려갈 수 있습니다.

 

16은 어떨까요? +1을 4번 사용하여 20이 된 뒤 -10을 두 번 사용하여 총 6번 사용할 수 있습니다.

같은 이유로 17~19는 5, 4, 3번 사용할 수 있습니다.

 

20은 -10을 두 번 사용하면 됩니다.

 

위 내용을 표로 정리해볼까요?

 

민수의 위치 사용한 횟수 민수의 위치 사용한 횟수
1 1 11 2
2 2 12 3
3 3 13 4
4 4 14 5
5 5 15 6
6 5 16 6
7 4 17 5
8 3 18 4
9 2 19 3
10 1 20 2

규칙성이 보이시나요?

1부터 5까지와 10부터 6까지 순서가 1~5로 같습니다.

11부터 15까지와 20부터 16까지 순서가 2~6로 같습니다.

 

그렇다면 25는 7이 되겠군요.

이러한 규칙성을 포함한 코드를 작성하였습니다.

 

def solution(storey):
    answer = 0
    for i in range(len(str(storey))-1 ,-1, -1):
        if int(str(storey)[i]) <5 and int(str(storey)[i-1])>4 and len(str(storey)) > 1:
            answer += int(str(storey)[i])
            storey -= int(str(storey)[i])*(10**(len(str(storey))-i-1))
        elif int(str(storey)[i]) <=5 and int(str(storey)[i-1])>4 and len(str(storey)) > 1:
            answer += int(str(storey)[i])
            storey += int(str(storey)[i])*(10**(len(str(storey))-i-1))
        elif int(str(storey)[i])<=5:
            answer += int(str(storey)[i])
            storey -= int(str(storey)[i])*(10**(len(str(storey))-i-1))
            
        else:
            answer += 10-int(str(storey)[i])
            storey += (10-int(str(storey)[i]))*(10**(len(str(storey))-i-1))
    if storey >=10 and str(storey)[0] <'6':
        answer += int(str(storey)[0])
    return answer
반응형