TIL/알고리즘

03/25 알고리즘 공부(76) - JadenCase 문자열 만들기

sos000303 2024. 3. 25. 10:01
728x90

조건

JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 쓰면 됩니다. (첫 번째 입출력 예 참고)
문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요.

제한조건

  • s는 길이 1 이상 200 이하인 문자열입니다.
  • s는 알파벳과 숫자, 공백문자(" ")로 이루어져 있습니다.
    • 숫자는 단어의 첫 문자로만 나옵니다.
    • 숫자로만 이루어진 단어는 없습니다.
    • 공백문자가 연속해서 나올 수 있습니다.

입출력 예

s return
"3people unFollowed me" "3people Unfollowed Me"
"for the last week" "For The Last Week"

알고리즘 예상

  1. split을 이용해 s를 " "을 기준으로 나눈 다음 첫 원소를 toUpperCase(), 나머지 원소를 toLowerCase()를 사용해 바꾼다.
  2. joinToString(" ")을 이용해 처음 나눴던 s를 다시 합친다.

 

초기 코드

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

 

내 코드

class Solution76 {
    fun solution(s: String): String = s.split(" ").map {
        it.map { it }.mapIndexed { i, c ->
            if (i == 0) c.toUpperCase()
            else c.toLowerCase()
        }.joinToString("")
    }.joinToString(" ")
}

크게 어렵지는 않았다.

다른 사람의 풀이

class Solution {
     fun solution(s: String): String {
          return s.toLowerCase().split(" ").map {
                it.capitalize()
            }.joinToString(" ")
    }
}
class Solution {
    fun solution(s: String): String {
        var answerbuilder = StringBuilder()
        var space = true
        for(c in s) {
            if(space && c != ' ') {
                space = false
                answerbuilder.append(c.toUpperCase())
            }
            else {
                if(c == ' ')
                    space = true
                answerbuilder.append(c.toLowerCase())
            }
        }
        return answerbuilder.toString()
    }
}

개선점 또는 배운점

  1. 첫 풀이의 capitalize()라는 메서드는 1.5부터 deprecated되어 사용되지 않는다고 한다. 내 코드가 capitalize()를 대체하는 코드라고 생각한다.
  2. 아래 풀이는 StringBuilder와 반복문을 이용해 풀었다. Split을 사용하지 않고 space라는 변수를 이용해 해당 문자가 띄어쓰기 다음에 오는 첫 문자인지를 검사했다.
728x90