본문 바로가기
프로그래머스/Python

[프로그래머스] 마법의 엘리베이터 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트

by 우당탕탕 개발자 2024. 2. 4.
728x90
반응형

 

 

프로그래머스

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

programmers.co.kr

 

1. 문제 설명

2. 풀이과정

해당 문제는 마법의 돌을 최소한으로 사용하여 0층으로 갈 때의 마법의 돌 개수를 구하는 문제이다.

마법의 돌을 최소한으로 사용하려면 각 자릿수마다 -의 돌을 사용할지, +을 돌을 사용할지 결정하는 방법이 중요하다.

1의 자릿수부터 어떤 종류의 돌을 사용할지 정하며 전체 사용하는 돌의 개수에 더해준다.

 

만약 해당 자릿수의 값이 5 미만의 수이면, 그냥 -의 돌을 사용하여 내려온다.

만약 해당 자릿수의 값이 5를 초과하는 수이면, 반대로 그냥 +의 돌을 사용하여 올라간 후 한 번에 내려오는 것이 돌을 더 적게 사용하는 방법이다.

 

하지만 해당 자릿수의 값이 5이면 그때부터는 다음 자릿수의 값까지 고려해줘야 한다.

만약 다음 자릿수의 값이 5 미만의 수이면, 위의 5 미만의 수처럼 그냥 -의 돌을 사용하여 내려온다.

반면에 다음 자릿수의 값이 5 이상의 수이면, +의 돌을 사용하여 올라간 후 한 번에 내려온다.

위 방법으로 문제를 해결하면 최소한의 마법의 돌을 사용하여 0층으로 내려올 수 있다.

 

  1. 우선 입력받은 현재 위치한 층 수를 각 자릿수 별로 구분한다. storey_split = [int(i) for i in str(storey)]
  2. 1의 자릿수부터 사용하는 돌의 개수를 계산할 것이기 때문에 구분한 숫자 리스트를 거꾸로 뒤집어준다. storey_split.reverse()
  3. 마지막 자릿수를 계산할 때 5를 넘어 + 돌을 사용한다면 현재 위치한 층 수의 자릿수를 넘어갈 수 있기 때문에 0을 추가해 주어 다음 자릿수를 위한 공간을 만들어준다. storey_split.append(0)
  4. 리스트의 자릿수의 개수만큼 반복하며 for i in range(len(storey_split))
  5. 만약 해당 자릿수의 값이 5를 초과하는 값이면 if (storey_split[i] > 5)
  6. + 돌을 사용하여 올라가고 answer += 10 - storey_split[i]
  7. 다음 자릿수를 1 증가시켜 준다. storey_split[i + 1] += 1
  8. 만약 해당 자릿수의 값이 5이면 elif (storey_split[i] == 5)
  9. 그다음 자릿수의 값을 확인해 5 미만인 수이면 if (storey_split[i + 1] < 5)
  10. - 돌을 사용하여 그냥 내려온다. answer += storey_split[i]
  11. 반면에 다음 자릿수의 값이 5 이상인 수이면 else
  12. + 돌을 사용하여 올라가고 answer += 10 - storey_split[i]
  13. 다음 자릿수를 1 증가시켜 준다. storey_split[i + 1] += 1
  14. 반면에 해당 자릿수의 값이 5 미만인 수이면 else
  15. - 돌을 사용하여 그냥 내려온다. answer += storey_split[i]
반응형

3. 소스코드

def solution(storey):
    answer = 0
    
    storey_split = [int(i) for i in str(storey)]
    storey_split.reverse()
    storey_split.append(0)

    for i in range(len(storey_split)):
        if (storey_split[i] > 5):
            answer += 10 - storey_split[i]
            storey_split[i + 1] += 1
        
        elif (storey_split[i] == 5):
            if (storey_split[i + 1] < 5):
                answer += storey_split[i]
            else:
                answer += 10 - storey_split[i]
                storey_split[i + 1] += 1
                
        else:
            answer += storey_split[i]
        
    return answer
728x90
반응형