Lv 1. 숫자 문자열과 영단어 Feat. replacingOccurrences(of:with)

YeongHyeon Jo·2023년 9월 20일
0

Algorithm

목록 보기
3/10

프로그래머스 Lv 1. 카카오 문제!

심지어 이번 문제는 '2021 카카오 채용연계형 인턴십'에 나왔던 문제라고 한다!
어디 한번 시도해보자~

어떻게 풀이를 시도할지 먼저 생각을 하였다.

  1. 입력받은 문자열's'를 순서대로 나열한다.
  2. 차례대로 나열을 하면서 숫자인 경우에는 결과값에 그대로 표시를 한다.
  3. 숫자가 아닌 경우 임의의 변수에 저장한다.
  4. 임의의 변수에 저장한 String이 영어 숫자(숫자 배열)일 경우 숫자로 바꿔준다.

차례대로 한번 해보자!

1. 입력받은 문자열's'를 순서대로 나열한다.

let s = "2three45sixseven"
for number in s.enumerated() {
	print(number)
}
//(offset: 0, element: "2")
//(offset: 1, element: "t")
//(offset: 2, element: "h")
//(offset: 3, element: "r")
//(offset: 4, element: "e")
//(offset: 5, element: "e")
//(offset: 6, element: "4")
//(offset: 7, element: "5")
//(offset: 8, element: "s")
//(offset: 9, element: "i")
//(offset: 10, element: "x")
//(offset: 11, element: "s")
//(offset: 12, element: "e")
//(offset: 13, element: "v")
//(offset: 14, element: "e")
//(offset: 15, element: "n")

임의로 넣은 데이터를 실행시키게 되면 위와 같은 결과를 얻을 수 있다.

2. 차례대로 나열을 하면서 숫자인 경우에는 결과값에 그대로 표시를 한다.

if number.element.isNumber {
	result += String(number.element)
}

위의 코드에서 for문 내부에서 number.element가 숫자인지 판단하기 위한 isNumber을 사용한다. 그리하여 숫자인 경우에 결과를 표시한다!

3. 숫자가 아닌 경우 임의의 변수에 저장한다.

if number.element.isNumber {
	result += String(number.element)
} else {
	word += String(number.element)
}

이미 if문의 조건에서 숫자인 경우를 정하였으니 그 외의 것들은 else로 빠져나왔을 때를 정한다.

4. 임의의 변수에 저장한 String이 영어 숫자(숫자 배열)일 경우 숫자로 바꿔준다.

let englishNumber: [String] = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]

var englishNumberDictionary = [String: Int]()
    
for (index, number) in englishNumber.enumerated(){
	englishNumberDictionary[number] = index
}

if englishNumber.contains(word) {
	result += String(englishNumberDictionary[word] ?? 0)
	word = ""
}

임의의 변수 word에 저장한 문자열이 'englishNumber' 문자열 배열에 포함이 되면 안에 내용을 실행하는 것으로 구현하였다. 이 때 contains()를 사용해서 문자열 비교를 하였다!
그리고 위에서 사용한 Dictionary는 영어 숫자들의 숫자값을 저장하기 위해 for문으로 데이터를 저장하였다.

그리고 마지막으로 최종으로 result값을 출력하면 끝!

최종 코드

let englishNumber: [String] = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]

func solution(_ s:String) -> Int {
    var result: String = ""
    var word: String = ""
    var englishNumberDictionary = [String: Int]()
    
    for (index, number) in englishNumber.enumerated(){
        englishNumberDictionary[number] = index
    }
    
    for number in s.enumerated() {
        if number.element.isNumber {
            result += String(number.element)
        } else {
            word += String(number.element)
            if englishNumber.contains(word) {
                result += String(englishNumberDictionary[word] ?? 0)
                word = ""
            }
        }
    }
    
    return Int(result) ?? 0
}

자! 이제 다른 분들의 풀이를 보고 한번 풀어보도록 하겠습니다!

다른 풀이

func solutionV1(_ 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)!
}

이분은 입력받은 문자열's'에 replacingOccurrences를 사용하셨는데 이게 뭔지 한번 알아보자!
공식문서를 참조하면 'target'값을 'replacement'값으로 교체를 할 수 있다고 한다!

  • target: 대체하려는 대상 문자열 이 문자열이 원래 문자열에서 찾아지면 대체
  • replacement: 대상 문자열이 발견되면 이 문자열로 대체

밑으로 내려보니 또다른 방식이 있었다.

여기서 추가되는 항목은 각각 'option'과 range가 추가된다.

  • options: 문자열 검색 옵션을 나타내는 String.CompareOptions 옵션.
    이 매개변수를 사용하여 대소문자 무시, 정규 표현식 등과 같은 검색 옵션을 설정 가능.
    기본값은 빈 배열이며, 이 경우 대소문자 구분 없이 일치를 찾음.
  • searchRange: 검색 범위를 나타내는 문자열 범위(Range<String.Index>)
    이 매개변수를 사용하여 원하는 부분 문자열 내에서만 검색 및 대체를 수행 가능.
    기본값은 nil로, 전체 문자열을 대상으로 대체 작업을 수행.

결과적으로 replacingOccurrences를 사용해서 문자열에서 해당되는 부분을 교체하는 형식으로 푸셨다!
이게 더 간단하게 보여서 다음번에 위와같은 문제가 있다면 꼭 응용해보겠따!

profile
my name is hyeon

0개의 댓글

관련 채용 정보