문제 링크
코딩테스트 연습 - 숫자 문자열과 영단어
문제
이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나,
혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다.
s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.
입력
let s = "one4seveneight"
출력
1478
문제 풀이
Number 모델
- rawValue를 Int가 아닌 String을 갖도록 해, 문자열로부터 Number의 case에 접근하기 쉽도록 했음
- 만약 Number가 rawValue를 Int를 갖게 한다면, Number가 CaseIterable를 준수하도록 해야 하며,
- 해당 case 이름과 일치하는 case를 찾기 위해서 case를 순환해야 하는 문제가 발생함
enum Number: String {
case zero
case one
case two
case three
case four
case five
case six
case seven
case eight
case nine
var number: Int {
switch self {
case .zero: return 0
case .one: return 1
case .two: return 2
case .three: return 3
case .four: return 4
case .five: return 5
case .six: return 6
case .seven: return 7
case .eight: return 8
case .nine: return 9
}
}
}
- temp는 임시 텍스트를 담는 변수
- rawValue를 통해 Number를 얻을 수 있음
let temp = "one"
let number = Number(rawValue: temp)
solution 함수
- result는 문자열로 변환된 숫자를 담는 String 타입 변수
- temp는 임시로 문자를 담는 변수
- checkTemp에서 temp를 체크한 후, 숫자를 만들 수 있다면 result에 추가하고, temp를 비움
func solution(_ s:String) -> Int {
var result = ""
var temp = ""
func checkTemp() {
guard let number = Number(rawValue: temp) else { return }
result += String(number.number)
temp = ""
}
for char in s {
let str = String(char)
guard Int(str) == nil else {
result += str
continue
}
temp += str
checkTemp()
}
return Int(result) ?? 0
}
전체 코드
enum Number: String {
case zero
case one
case two
case three
case four
case five
case six
case seven
case eight
case nine
var number: Int {
switch self {
case .zero: return 0
case .one: return 1
case .two: return 2
case .three: return 3
case .four: return 4
case .five: return 5
case .six: return 6
case .seven: return 7
case .eight: return 8
case .nine: return 9
}
}
}
func solution(_ s:String) -> Int {
var result = ""
var temp = ""
func checkTemp() {
guard let number = Number(rawValue: temp) else { return }
result += String(number.number)
temp = ""
}
for char in s {
let str = String(char)
guard Int(str) == nil else {
result += str
continue
}
temp += str
checkTemp()
}
return Int(result) ?? 0
}