티스토리 뷰

반응형

 

 

 

오늘은 프로그래머스의 카카오 인턴 기출문제 첫번째로 나온, 숫자 문자열과 영단어 문제를 swift로 풀어보겠습니다. 제가 작성한 코드가 최적해는 아니니, 이부분 고려해서 봐주시면 되겠으며, 기타 의견과 지적 환영합니다. 

 

숫자 문자열과 영단어 문제는 어떠한 문자열이 주어졌을때, 영어로 작성된 숫자를 실제 숫자값으로 변환해서 반환하는 문제로 예를들어 "onezerothree4"는 1034의 숫자값으로 변환해서 반환해야합니다. 변환되는 값은 20억을 초과하지 않는다고 하니, int타입의 범위초과 문제는 고려하지 않아도 될 것 같습니다. (더더욱 swift의 Int타입은 문제없죠)

해당문제는 아래 프로그래머스 링크에서 확인해보실 수 있습니다. 바로 swift 문제풀이를 가보도록 하겠습니다.

 

 

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

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다. 다음은 숫자의 일부 자

programmers.co.kr

 

 

 

 


카카오 인턴 기출문제, 숫자 문자열과 영단어 swift 문제풀이

2행) 먼저 변환이 필요한 문자열의 정보를 리스트로 저장했습니다. 타입은 (String, Int)의 튜플을 리스트로 담고 있으며 각각의 요소는 변환이 필요한 문자열과 문자열의 길이 정보를 담고 있습니다. String타입의 count 프로퍼티를 사용해서 문자열 길이를 확인할 수도 있겠지만, String count의 시간복잡도는 O(N)이기 때문에 좀더 효율적으로 연산을 수행하기 위해 별도 길이정보까지 담아놨습니다.

 

 

 

 

6 ~ 19행) [Character] 타입 배열에 대한 extension 기능을 구현했습니다. [Character]타입 배열의 특정 인덱스를 기준으로 특정 알파벳 영어가 발견될 경우, 해당 알파벳의 실제 숫자값과 발견된 알파벳 영문 문자열 길이를 반환하도록 했습니다. 예를들어, "zero"는 (0, 4)를, "seven"은 (7, 5)를 반환하는 방식입니다. getNumber 메서드로 반환되는 튜플 값은 사전 정의 된 레이블 명으로 접근할 수도, .0 / .1 등의 튜플 정의 순서로 접근할 수도 있습니다.

* 9행의 where 절은 현재 확인하고 있는 알파벳 영문의 길이 전체를 탐색할 때 self Array의 최대 길이를 초과하는지 판단해서 out of range를 방지하기 위함입니다.

 

[Character]타입 배열의 extension을 구현한 이유는 해독이 필요한 문자열을 [Character] 배열로 변환하여 연산하여 문제를 풀것이기 때문입니다. 

 

20행) (-1, -1)은 해당 문제에서 반환되어선 안되는 값입니다. 디버깅 목적으로 위와같이 구현했습니다. 실제로는 반환될 경우의 수가 없습니다. (입력값이 정상적이라면 말이죠.)

 

 

 

이제 solution 메서드를 구현해보겠습니다.

25행) 앞서 말했듯이, 해독이 필요한 문자열 s를 [Character] 배열 타입의 array로 변환했습니다. 

26행) 정답 값과 탐색한 인덱스를 가리킬 answer, index 변수를 선언했습니다.

27 ~ 38행) 이어서 array의 인덱스를 탐색하면서 문자가 숫자일 경우, 숫자 값 그대로 / 탐색 인덱스를 기준으로 "one", "three" 등의 문자열이 있을 경우 해당 문자열에 대응되는 숫자값을 기록하고, 그 문자열 길이만큼 인덱스를 점프시켜줍니다. (35행) 그렇게 연산된 숫자 값, answer를 최종적으로 38행에서 반환해주면서 해당 문제의 풀이는 끝이 나게 됩니다.

ex) "onezero3two" 일 경우 -> 0 * 10 + 1 = 1 -> 1 * 10 + 0 = 10 -> 10 * 10 + 3 = 103 -> 103 * 10 + 2 = 1032

 

아래는 숫자 문자열과 영단어 문제 swift 언어 풀이 제출결과 및 전체 swift 소스코드입니다. 앞서 말씀드렸듯이, 제가 작성한 코드에도 개선이 될 부분이 많을 수 있습니다. 많은 지적과 의견 부탁드립니다. 그럼, 즐거운 주말 코딩(?) 되시길 바라며 이만 줄입니다.

 

 

 


숫자 문자열과 영단어 swift 소스코드 제출결과 및 전체 소스코드

let numberInfoList: [(String, Int)] = [("zero", 4), ("one", 3), ("two", 3), ("three", 5),
                                       ("four", 4), ("five", 4), ("six", 3), ("seven", 5),
                                       ("eight", 5), ("nine", 4)]

extension Array where Element == Character {
    func getNumber(at oIndex: Int) -> (number: Int, length: Int) {
        for (index, numberInfo) in numberInfoList.enumerated()
            where oIndex + numberInfo.1 - 1 < count {
            var good = true
            var nowIndex = oIndex
            for numberChar in numberInfo.0 {
                if self[nowIndex] != numberChar {
                    good = false; break
                }
                nowIndex += 1
            }
            if good { return (index, numberInfo.1) }
        }
        return (-1, -1)
    }
}

func solution(_ s: String) -> Int {
    let array = Array(s)
    var (answer, index) = (0, 0)
    while index < array.count {
        let char = array[index]
        if char.isNumber {
            answer = answer * 10 + Int(char.asciiValue!) - 48
            index += 1
        } else {
            let numberInfo = array.getNumber(at: index)
            answer = answer * 10 + numberInfo.number
            index += numberInfo.length
        }
    }
    return answer
}

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함