PS/문제 풀이

[프로그래머스/Swift] 148653번 - 마법의 엘리베이터

시르베어 2025. 3. 7. 18:42

🔗 문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/148653

💡 구현 아이디어

  1. 0~4는 아래로 이동
  2. 6~9는 위로 이동, 그다음 자릿수 값 +1
  3. 5는 위로 갈지 아래로 갈지 모르니까 둘다 구해서 최소값 반환

💻 코드

import Foundation

func solution(_ storey:Int) -> Int {
  let arr = String(storey).reversed().map{ Int(String($0))! }
  let result = min(solve(num: 4, arr: arr),solve(num: 5, arr: arr))
  
  return result
}
func solve(num: Int, arr: [Int]) -> Int {
  var arr = arr
  var result: Int = 0
  var idx = 0
  while idx < arr.count {
    if arr[idx] == 10 {
      if idx == arr.count - 1 {
        arr.append(0)
      }
      arr[idx] = 0
      arr[idx+1] += 1
    }
    if arr[idx] <= num {
      result += arr[idx]
    }else {
      result += (10-arr[idx])
      if idx == arr.count - 1 {
        arr.append(0)
      }
      arr[idx+1] += 1
    }
    idx += 1
  }
  return result
}

❌ 틀린 이유 및 틀린 부분

5일 경우 위로 갈지 아래로 갈지 판단을 못했다. 그래서 둘다 구해주고 둘중 작은걸 고르기로 했다!

⏳ 시간 복잡도

O(n) - 각 자리의 수를 한번씩 순회하고 결과를 반환(2번 돌아서 2n 이지만? 빅오는 O(n)!)

📌 풀이 또는 기억할 정보

var storey = storey
var result = 0

while storey != 0 {
	if storey % 10 > 5 || (storey % 10 == 5 && (storey / 10) % 10 >= 5) {
		result += 10 - (storey % 10)
		storey = (storey / 10) + 1
	} else {
		result += storey % 10
		storey = storey / 10
	}
}
return result
  • 조건은 55 와 같이 연속적으로 등장하는 경우 위로 올라가서 내려오는 것을 선택, 만약 5가 단독으로 등장하면 아래로 내려가는 것을 선택