본문 바로가기
Algorithm/Kotlin

[프로그래머스 • 코틀린] 숫자 문자열과 영단어 #81301

by 키윤 2023. 11. 29.

#81301

🎄 Question ?

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

class Solution {
    fun solution(s: String): Int {
        var answer: Int = 0
        return answer
    }
}

🧩 Thought Process

  1. 가장 먼저 string에서 string의 일부분(substring을 가져오는 방법을 공부해보았다. 찾아보니 subSequence(startIndex, endIndex) 라는 함수를 사용하여 문자열의 인덱스를 지정하여 substring을 가져오는 방법이 있었다. endIndex는 포함되지 않는다. 이걸 응용해서 문제를 풀어봐야겠다.
  2. 가장 먼저 s의 character를 정수형으로 바꾸어주고(아스키 코드 응용해서 풀이할거임) 리스트에 넣어주었다.
  3. while~do문으로 리스트 사이즈 만큼 돌려줌. (size 프로퍼티 사용하기)
  4. 그 안에 when 문을 람다식을 이용하여 작성해주기. 
  5. 영문으로 적은 숫자가 시작하는 알파벳은 z, o, t, f, s, e, n 총 일곱개이고 이 알파벳에 대응하는 아스키코드로 경우를 나누어주기
  6. 시작되는 알파벳이 중복되는 경우는 추가적으로 경우 나누어주기
class Solution {
    fun solution(s: String): Int {
        var answer: List<Int> = 0
        var sArray = s.toCharArray()
        var i = 0
        do {
            when(sArray[i]) {
                in "z" -> (i += 4
                    answer.add(0))
                in "o" -> (i += 3
                    answer.add(1))
                in "t" -> (
                    when (sArray[i+1]) {
                        in "w" -> (i += 3
                            answer.add(2))
                        else -> (i += 5
                            answer.add(3))
                        })
                in "f" -> (
                    when (sArray[i+1]) {
                        in "o" -> (i += 4
                            answer.add(4))
                        else -> (i += 4
                            answer.add(5))
                        })
                in "s" -> (
                    when (sArray[i+1]) {
                        in "i" -> (i += 3
                            answer.add(6))
                        else -> (i += 5
                            answer.add(7))
                        })
                in "e" -> (i += 5
                    answer.add(8))
                in "n" -> (i += 4
                    answer.add(9))
                else -> (answer.add(sArray[i].digitToInt())
                    i++
                )
            }
        } while(i < sArray.size)

        return answer.toInt()
    }
}

엉망이지만 내가 작성해본 코드.

🎀 Answer

package Kakao_Internship_2021.숫자_문자열과_영단어

class Solution {
    fun solution(s: String): Int {
        val nums = arrayOf("zero", "one", "two", "three", "four", "five", "six", "seven","eight", "nine")
        var str = s
        for (i in 0 until nums.size) {
            str = str.replace(nums[i], i.toString())
        }
        return str.toInt()
    }
}

nums라는 array에 모든 수를 저장하고 저장된 수의 인덱스가 적혀있는 수와 일치함을 이용하였다.
풀이 미쳤다..

풀이 2

fun main(args: Array<String>) {
    println(solution("one4seveneight"))
    println(solution("23four5six7"))
    println(solution("2three45sixseven"))
    println(solution("123"))
}

fun solution(s: String): Int {
    val dicNumber: HashMap<String, String>
    dicNumber = hashMapOf(
        "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",
        "zero" to "0"
    )
    var answer = ""
    var stringNumber: String = ""
    for (str in s) {
        if (str.isDigit()) answer += str
        else {
            stringNumber += str
        }
        if (dicNumber.containsKey(stringNumber)) {
            answer += dicNumber[stringNumber]
            stringNumber = ""
        }
    }
    return answer.toInt()
}

딕셔너리랑 hashmapof 사용한 코드.

🎁 Result

 

🏆 Comment

싱기...