Top Interview Questions
Easy Collection
LEVEL : 🌕 🌕 🌑 🌑 🌑 (하)
Easy Collection의 일곱번째 문제인 Plus One를 풀어봤습니다.
처음에 문제를 잘못 파악했을 때 쉬운 문제인 줄 알았는데, 생각보다 머리를 써야하는 문제였습니다.
Array의 맨 마지막 숫자에 +1를 했을 때 값을 Array로 출력하는 문제였는데요.
문제는 +1했을 때 해당값이 10이 되면 해당 부분을 0으로 바꿔주고 앞 부분들에 해당 carry가 +1되어야 하는 문제였어서 그런 부분들이 조금 까다로웠습니다.
코드를 보면서 설명드리겠습니다.
잘못 이해한 방식입니다.
문제를 보자마자 "뭐야, 맨 마지막 배열 원소에 +1 하면 되잖아?" 라고 생각해서 푼 방식입니다.
실제로 맨 뒤 숫자가 9 미만이라면 carry가 생길 일이 없기 때문에 해당 방식이 맞지만, 9라면 해당 방식이 완전히 잘못 됐기 때문에 2번 방식부터는 9를 생각하면서 풀었습니다.
func plusOne(_ digits: [Int]) -> [Int] {
var num = digits
num[digits.count-1] += 1
return num
}
실패한 방식입니다.
+1를 어떻게 해주면 좋을까 하다가. 배열에 있는 원소들을 자리에 맞게 10의 거듭제곱을 곱해서 숫자로 만든 다음, 1를 더한 값을 다시 배열에 넣으면 되겠다! 싶었습니다.
그렇게 하면 따로 1를 더하는 로직을 짜지 않아도 숫자니깐 자연스럽게 더해지겠죠?
func plusOne(_ digits: [Int]) -> [Int] {
var num: [Int] = []
var sum = 0
for i in 0..<digits.count {
sum += digits[i] * Int(pow(10, Double(digits.count - (i + 1))))
}
sum += 1
for n in "\(sum)" {
num.append(Int(String(n))!)
}
return num
}
하지만 문제가 생겼습니다. 가장 긴 배열의 길이가 100이기 때문에 100의 100 거듭제곱까지 나타나게 되는데, 해당 길이가 Int가 충족시킬 수 있는 길이를 넘어서 Fatal Error가 발생합니다.
혹시나 싶어서 UInt로도 진행해봤는데요. 똑같은 Fatal Error가 발생했습니다..🥲
그렇다면 어떻게 +1를 해줄까 싶었습니다.
문득 1번째 방법에서 말했듯 9가 아니라면 다 carry를 생각해줄 필요가 없는데, 제가 그냥 배열에서 +1 해도 되는 걸 숫자로 푼 다음에 다시 배열로 만드는 헛수고를 하고 있다는 걸 깨달았습니다.
그럼 일단, +1를 하고서 맨 뒤가 10이라면 carry 문제를 해결하자 라는 결론이 나왔습니다.
맨 뒤 숫자부터 보면서 해당 숫자가 9보다 크다면 10으로 나눈 나머지 값을 값으로 가지고 해당 수의 앞에 있는 수에 +1를 더해줬습니다.
하지만 해당 수가 맨 앞에 있는 숫자라면 어떡하지? 라는 생각이 들더라구요.
그럼 그 앞에 1를 넣어주자 라는 결론이 나왔습니다.
insert
를 사용해서 원하는 위치에 1를 넣도록 코드를 짰습니다.
func plusOne(_ digits: [Int]) -> [Int] {
var num = digits
num[digits.count - 1] += 1
for i in num.indices.reversed() {
if num[i] > 9 {
num[i] = num[i] % 10
if i == 0 {
num.insert(1, at: 0)
} else {
num[i - 1] += 1
}
}
}
return num
}
Runtime도 4ms밖에 안걸렸습니다.
매일 코드를 짜면 감이 좀 잡힐 것 같았는데, 아직은 Swift에서 사용할 수 있는 자료구조를 많이 몰라서 그런지 쉽게 앞으로 나아가지질 않네요🥲
더 갈고 닦아야겠습니다.