본문 바로가기
🐣 알고리즘

[프로그래머스] Swift - 숫자 문자열과 영단어(LV.1)

by @Eddy 2023. 5. 27.
728x90

👆문제풀러 가기👆

 

문제 설명

 

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

다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.

  • 1478 → "one4seveneight"
  • 234567 → "23four5six7"
  • 10203 → "1zerotwozero3"

이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.

참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다.

숫자 영단어
0 "zero"
1 "one"
2 "two"
3 "three"
4 "four"
5 "five"
6 "six"
7 "seven"
8 "eight"
9 "nine"

제한사항

  • 1 ≤ s의 길이 ≤ 50
  • s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다.
  • return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.

풀이 [ 메모리: 16,896kb, 최대 시간: 0.08ms ]

func solution(_ s:String) -> Int {
    let voca = ["zero": "0", "one": "1", "two": "2", "three": "3", "four": "4",
               "five": "5", "six": "6", "seven": "7", "eight": "8", "nine": "9"]
    var temp = ""
    var result = ""
    
    for char in s {
        // 숫자여부 체크, 문자라면 임시 저장
        if Int(String(char)) != nil {
            result += String(char)
        } else {
            temp += String(char)
        }
        
        // 합친 문자가 단어장에 있는 단어이면 치환, 임시값 비우기
        if voca.keys.contains(temp) {
            if let voca = voca[temp] {
                result += voca
                temp = ""
            }
        }
    }
    
    return Int(result) ?? -1
}

 

실제 시험이었다면 1번문제로 예상되는? 난이도의 문제였다

나는 문자를 하나씩 받아 합쳐서, 단어를 만드는 방식을 채택했는데

별다른 메서드를 사용하지 않고 단순 로직으로만 구현할수 있다는 점이 장점이라면 장점이다.

 

메서드를 사용한다면 ReplacingOccurrences(of: ,with:)을 사용할 수 있겠다 싶었는데, 다른 분들은 이 메서드를 많이 사용한 거로 보였다.

 

다른 풀이 [ 메모리: 16,896kb, 최대 시간: 0.97ms ]

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

 

반응형

댓글