(코딩테스트)숫자 문자열과 영단어(replace)

2024. 3. 29. 16:43개발자 과정/Kotlin

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

 

프로그래머스

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

programmers.co.kr

풀이의 선택과정

1. 숫자문자열과 index가 매칭된 String배열을 만든다. 

2. 전달받은 문자열을 탐색하며 알파벳이면 token에 누적한다.

3. 누적된 token3size를 넘어가면(최소문자열 길이) 배열에 해당 원소가 있는지 검색한다.

4. 해당 원소가 있으면 매칭된 index를 answer에 누적하고 token을 비운다.

 

정답풀이

class Solution {
    fun solution(s: String): Int {
        var answer: String = ""
        val strArr=arrayOf("zero", "one","two","three","four","five","six","seven",
            "eight","nine")
        var Stoken=""
        s.forEach {
            if(it.isLetter()) Stoken+=it
            else answer+=it.digitToInt()
            if(Stoken.length>=3&&Stoken in strArr) {
                answer += strArr.indexOf(Stoken)
                Stoken=""
            }
        }
        return answer.toInt()
    }
}

 

핵심로직

if(Stoken.length>=3&&Stoken in strArr) {
                answer += strArr.indexOf(Stoken)
                Stoken=""
            }

token이 일정 수준 이상 누적되면 strArr배열매칭시켜보고, 매칭되면 index를 받아온다.

 

새로 알게된 것

replace()

내가 지정한 문자열과 매칭되는 token이 있으면, 원하는 문자열로 바꾸고, 이것을 리턴한다.

=  다른 사람의 문제풀이를 보니 replace를 쓰는게 많이 보였다.

아차...!!코틀린은 고급언어지!!! 고급언어는 추상적 로직에 강한 면이 두드러 지는데, 

이로 인해 문자열에 대한 기능이 정말 강력한게 많다는걸 잠깐 망각했다. 

그러면 이걸 통해 나의 로직도 간략화 할 수 있겠다 싶어 새로 만들어 보았다. 

 

새로만든 로직

class Solution {
    fun solution(s: String): Int {
        var answer: String = s
        val strArr=arrayOf("zero", "one","two","three","four","five","six","seven",
            "eight","nine")
        strArr.forEachIndexed { index, it ->
            answer=answer.replace(it, index.toString())
        }
        return answer.toInt()
    }
}

 

핵심로직

 strArr.forEachIndexed { index, it ->
            answer=answer.replace(it, index.toString())
        }

strArr를 한바퀴 돌면서 forEachIndexed 를 통해 index와 원소를 둘다 뽑아와 replace에 넣는다.

= 알고리즘이라는 단계까지 가지도 않고 문제가 해결이 되었다.