프로그래머스 - 숫자 문자열과 영단어도움말
안녕하세요. 개발 중인 정주입니다.
오늘은 프로그래머스의 숫자 문자열과 영단어도움말 문제를 풀었습니다.
2021 카카오 채용연계형 인턴쉽의 문제 중 하나라고 합니다.
Github
https://github.com/jeongju9216/swiftAlgorithm
문제 링크
https://programmers.co.kr/learn/courses/30/lessons/81301
풀이
해당 문제는 단순 반복문으로 해결이 가능합니다.
input이 50 글자 이하이기 때문입니다.
또한 결과는 20억 이하의 정수이기 때문에 정수의 최댓값을 넘칠 걱정도 하지 않아도 됩니다.
마지막으로 시작이 0 또는 zero로 입력되는 값은 없다고 하니 String으로 할 필요 없어!라고 온몸으로 표현하고 있는 듯합니다.
코드
import Foundation
func solution(_ s:String) -> Int {
let list = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]
var result: String = ""
var temp: String = ""
for c in s {
if c.isNumber {
result += String(c)
} else {
temp += String(c)
}
for i in 0 ..< list.count {
if temp == list[i] {
temp = ""
result += String(i)
}
}
}
return Int(result) ?? 0
}
입력 String의 문자를 하나씩 비교합니다.
숫자면 result에 바로 넣고 문자면 temp 문자열에 넣고 list의 요소 중 같은 값이 있는지 확인합니다.
시간 복잡도는 O(n)입니다만 이상한 점은 마지막 라인을 Int(result)!로 수정하면 시간 초과가 나더라고요.
왜 그런지 모르겠습니다..
혹시 아시는 분은 댓글로 알려주시면 감사하겠습니다.
추가로 공감수가 1위인 제출 코드는 문자열 치환 함수인 replacingoccurrences()를 중첩 사용하여 풀었는데
return값이 20억 이하인 만큼 입력 문자열 길이는 20억 이상이라고 생각하여 중첩하는 것은 그리 좋지 않다는 생각이 들었습니다.
그래서 해당 코드로 제출을 해보니 큰 차이는 없지만 제 코드가 좀 더 빠르더군요.
대략 4배가량 차이가 나서 아쉬움이 있지만 중첩으로 사용만 하지 않는다면 굉장히 편리하게 사용할 수 있을 것 같습니다.
마무리 인사
오늘은 프로그래머스에서 처음으로 문제를 풀어보았습니다.
백분과는 다른 스타일의 입력 방법으로 살짝 당황을 했는데요.
Solution 함수만 넣으면 되니 한 번 적응하고 나니 편하다는 생각이 들었습니다.
감사합니다!
아직은 초보 개발자입니다.
더 효율적인 코드 훈수 환영합니다!
공감과 댓글 부탁드립니다.