[Level 1] 숫자 문자열과 영단어 + Swift

sanghee·2022년 5월 6일
0

🙈코딩테스트

목록 보기
52/52
post-thumbnail

문제 링크

코딩테스트 연습 - 숫자 문자열과 영단어

문제

이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 
혹은 바뀌지 않고 그대로인 문자열 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 함수

  1. result는 문자열로 변환된 숫자를 담는 String 타입 변수
  2. temp는 임시로 문자를 담는 변수
  3. 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
}
profile
👩‍💻

0개의 댓글