숫자 문자열과 영단어

[level 1] 숫자 문자열과 영단어 - 81301

문제 링크

성능 요약

메모리: 16.5 MB, 시간: 0.07 ms

구분

코딩테스트 연습 > 2021 카카오 채용연계형 인턴십

채점결과

정확성: 100.0
합계: 100.0 / 100.0

제출 일자

2024년 05월 11일 14:03:31

문제 설명

img1.png

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

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

  • 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로 주어집니다.

입출력 예
s result
"one4seveneight" 1478
"23four5six7" 234567
"2three45sixseven" 234567
"123" 123

입출력 예 설명

입출력 예 #1

  • 문제 예시와 같습니다.

입출력 예 #2

  • 문제 예시와 같습니다.

입출력 예 #3

  • "three"는 3, "six"는 6, "seven"은 7에 대응되기 때문에 정답은 입출력 예 #2와 같은 234567이 됩니다.
  • 입출력 예 #2와 #3과 같이 같은 정답을 가리키는 문자열이 여러 가지가 나올 수 있습니다.

입출력 예 #4

  • s에는 영단어로 바뀐 부분이 없습니다.

내가 푼 풀이

func solution(_ s:String) -> Int {
    let wordtonum: [String:String] = ["zero": "0", "one": "1", "two": "2", "three": "3", "four": "4", "five": "5", "six": "6", "seven": "7", "eight": "8", "nine": "9"]
    
    var answer = ""
    var temp = ""
    
    for char in s {
        if char.isNumber {
            answer.append(char)
        } else {
            temp.append(char)
            if let num = wordtonum[temp] {
                answer.append(num)
                temp = ""
            }
        }
    }
    return Int(answer) ?? 0
}

wordtonum을 통해 딕셔너리 구조로 숫자를 나열한다.

var answer = ""
var temp = ""

빈 문자열을 초기화해서 answer는 최종 반환 값이 들어가도록 하고 temp는 현재 처리중인 영단어를 저장하도록 한다.

for char in s {
    if char.isNumber {
        answer.append(char)

문자열 s 를 문자 단위로 순회하고 char가 숫자일때 answer에 추가하도록 한다.

} else {
      temp.append(char)
      if let num = wordtonum[temp] {
          answer.append(num)
          temp = ""
      }

숫자가 아닐 경우에 영단어 이므로 temp에 해당 단어를 추가한 후 temp가 wordtonum에 해당하는 숫자가 있는지 확인한다. 해당 내용이 있다면 키 값에 대한 벨류 값이 answer에 추가되도록 한 후 temp를 빈문자열로 변환한다.

 

다른 사람의 풀이

func solution(_ s:String) -> Int {
    let arr = ["zero","one","two","three","four","five","six","seven","eight","nine"]
    var str = s
    for i in 0..<arr.count {
        str = str.replacingOccurrences(of: arr[i], with: String(i))
    }
    return Int(str)!
}

replacingOccurrences 를 활용해 보다 손 쉽게 코드를 구성한 점이 눈이 띈다.

s의 값을 0부터 arr 갯수 만큼 순회해 arr[i] 값에 해당하는 내용을 String(i)로 변환한다. 그 이후 다시 Int를 씌워 리턴하면 풀이 완료

 

replacingOccurrences 란 무엇인가

Swift에서 문자열을 다룰때 특정 부분을 다른 문자열로 대체할때 사용된다. replacingOccurrences 메서드는 문자열 내 특정 부분을 다른 문자열로 대체하여 새로운 문자열을 반환하는데 사용된다.

let originalString = "Hello, World! Hello, Swift!"
let newString = originalString.replacingOccurrences(of: "Hello", with: "Hi")
print(newString) // 출력: "Hi, World! Hi, Swift!"

위 예시는 Hello 문자열을 Hi 로 대체하여 새로운 문자열을 뽑아냈다. 이런 식으로 사용되는 점을 숙지하자.

뿐 만 아니라 옵션을 사용해 대소문자 구분 여부 등도 알 수 있다.

func replacingOccurrences(of target: String, with replacement: String, options: String.CompareOptions = [], range searchRange: Range<String.Index>? = nil) -> String

replacingOccurrences 메서드는 원본 문자열을 변경하는 것이 아니라 새로운 문자열을 반환한다는 것을 잊지 말자!

 

'◽️ Programming > ◽️ Algorithm' 카테고리의 다른 글

삼총사  (0) 2024.04.16
문자열 다루기 기본  (0) 2024.03.25
부족한 금액 계산하기  (0) 2024.03.22
문자열 내림차순으로 정렬하기  (0) 2024.03.20
약수의 개수와 합계  (2) 2024.03.19