[프로그래머스] 숫자 문자열과 영단어

neoneoneo·2024년 2월 29일
1

kotlin

목록 보기
18/49

문제

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.
다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
1478 → "one4seveneight"
234567 → "23four5six7"
10203 → "1zerotwozero3"
이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.

나의 풀이

class Solution {
    fun solution(s: String): Int {
        var answer: Int = 0
        var tempForWord: String = ""
        var tempResult: String = ""
        val numberWord = mapOf(
            "zero" to 0, "one" to 1, "two" to 2, "three" to 3, "four" to 4,
            "five" to 5, "six" to 6, "seven" to 7, "eight" to 8, "nine" to 9
        )     
        s.forEach {
            if (it.isDigit()) { //문자가 숫자인지 판단
                tempResult += it //숫자가 계산되지 않도록 string 형태로 임시 결과 저장
            } else { //단어인 경우
                tempForWord += it //단어를 임시로 저장             
                val word = numberWord.keys.firstOrNull { tempForWord.startsWith(it) } //어떤 단어로 시작하는지 확인
                if (word != null) { //맵에 단어가 있다면(null이 아니라면)
                    tempResult += numberWord[word].toString() //임시 결과에 저장
                    tempForWord = "" //다시 for문을 돌아야 하므로 위해 초기화
                }
            }
        }                    
        answer = tempResult.toInt()      
        return answer
    }
}
  • .firstOrNull { } : 컬렉션에서 첫 번째 요소를 반환하거나 조건을 만족하는 첫 번째 요소를 반환하는 함수이다. 만족하지 않으면 null을 반환한다.
  • .startsWith() : 문자열이 주어진 접두사로 시작하는지 여부를 검사하는 함수이다.
    • 만약 one4를 s에 넣는다면, 첫 번째 if문을 돌면서 'o' 'e' 'n' 이린식으로 데이터를 tempForWord에 쌓게 되고, "one"이 되면 두 번째 if 문에서 더 이상 null이 아니게 된다(numberWord 안에 "one"이 존재하기 때문). 그럼 임시 결과 변수에 해당 word에 대응하는 value를 찾아 저장한다.

고수의 풀이

class Solution {
    fun solution(s: String): Int = s
        .replace("one", "1")
        .replace("two", "2")
        .replace("three", "3")
        .replace("four", "4")
        .replace("five", "5")
        .replace("six", "6")
        .replace("seven", "7")
        .replace("eight", "8")
        .replace("nine", "9")
        .replace("zero", "0")
        .toInt()
}
  • replace() : 문자열에서 특정 패턴을 다른 문자열로 대체한다.

배운점

  • 이 문제는 replace를 생각해내면 정말 빠르게 끝낼 수 있는 문제였다. 동시에 map의 구조를 적절하게 다루면 빠르게 끝낼 수 있기도 했다. 아직 map의 구조를 파악하는 과정이고, 실제로 어떻게 사용해야하는 지는 감이 부족한 것 같다. map으로 풀면 좋은 문제들만 모아져 있는 자료는 없을까?

[TIL-240229]

1개의 댓글

comment-user-thumbnail
2024년 3월 5일

오늘 알고리즘 코드 팀 리뷰가 처음이었는데 앞으로도 많은 도움이 될 것 같습니다.

답글 달기