알고리즘/Swift

programmers: 숫자 문자열과 영단어 (Swift)

두넌 2023. 5. 14.

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

import Foundation

func solution(_ s:String) -> Int {
    let engdict: [String: Int] = ["zero": 0, "one": 1, "two": 2, "three": 3, "four": 4, "five": 5, "six": 6, "seven": 7, "eight": 8, "nine": 9]
    var str: String = s
    
    for eng in engdict.keys {
        if(s.contains(eng)) {
            str = str.replacingOccurrences(of: eng, with: String(engdict[eng]!))
        }
    }
    return Int(str)!
}

다음과 같이 영문으로 표현된 숫자를 숫자로 바꿔서 원래의 숫자를 return하는 함수를 작성하는 것이다

일단 나는 각각의 영문을 숫자로 변환하기 위하여 0~9까지의 숫자를 딕셔너리로 미리 저장하였다

engdict.keys 배열의 원소들을 순회하면서 해당하는 key(영문 문자열)이 string에 존재하는지 contains()를 사용하여 검사하였고 String의 replacingOccurrences(of:, with:)를 사용하여 문자열에 들어있는 영문 문자열을 숫자 문자열로 바꾸어 주었다

여기서 새로 안 사실은 replacingOccurrences(of:, with:)라는 함수도 새로 알았지만, of와 with 즉 바꿀 문자열과 바뀔 문자열에 해당하는 인자 부분에는 반드시 String을 사용해야 한다는 점을 알게 되었다

그리고 딕셔너리의 해당 key에 해당하는 value를 가져오기 위해서 engdict[eng] 를 사용하였다

이는 옵셔널로 반환되기 때문에 언래핑이 필요하다

 

import Foundation

func solution(_ s:String) -> Int {
    let engdict: [String: Int] = ["zero": 0, "one": 1, "two": 2, "three": 3, "four": 4, "five": 5, "six": 6, "seven": 7, "eight": 8, "nine": 9]
    var str: String = s
    
    for eng in engdict {
        if(s.contains(eng.key)) {
            str = str.replacingOccurrences(of: eng.key, with: String(eng.value))
        }
    }
    return Int(str)!
}

이후 for loop부분을 수정하여 보았는데, keys를 순회할 필요 없이 딕셔너리를 순회하여 각각 원소의 key가 문자열에 포함되어 있는지 파악하고, key value로 바꾸는 과정을 거치는 두번째 풀이도 생각해 볼 수 있었던 것 같다

댓글