문제 설명
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" |
풀이
class Solution {
fun solution(s: String): String {
val sb = StringBuilder()
s.split(" ").forEachIndexed{ index, s ->
if(s.isEmpty()){
sb.append(" ")
return@forEachIndexed
}
sb.append(s[0].uppercase() + s.substring(1 until s.length).lowercase()+ " ")
}
return sb.deleteCharAt(sb.length-1).toString()
}
}
공백을 기준으로 나누고 빈 값이 올 경우 공백을 추가한 후 출력할 때 맨 마지막 공백 문자를 지우는 방식입니다.
제한조건에 적혀있는 것처럼 공백 문자가 연속해서 나오게 되면 공백 사이 빈 값이 들어오게 되는데 빈 값은 길이가 0이므로 substring에서 StringIndexOutOfBoundsException이 뜨게 됩니다. 따라서 isEmpty()로 빈 값이 올 경우 공백을 추가하고 반복문으로 리턴하도록 설계했습니다. (공백으로 split 했으므로 isEmpty(), isBlank() 구분 없이 쓸 수 있습니다.)
그리고 JadenCase로 변경하면 마지막 문자열은 무조건적으로 공백 문자를 추가하게 돼있으므로 출력 시 하나 빼줬습니다.
결과

다른 사람의 풀이
class Solution {
fun solution(s: String): String {
return s.toLowerCase().split(" ").map {
it.capitalize()
}.joinToString(" ")
}
}
capitalize() 함수를 이용한 풀이입니다. 생각지도 못한 풀이 방법이라 한 번 가져왔습니다.
현재 capitalize() 함수는 코틀린 1.5 버전 이후로 중단됐으므로 replaceFirstChar 함수를 쓰는 거 추천드립니다. 코틀린에서 추천하는 방식으로 다시 짜면 다음과 같습니다.
class Solution {
fun solution(s: String): String {
return s.lowercase().split(" ").joinToString(" "){
it.replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() }
}
}
}
- toLowerCase -> lowercase = 함수 변경
- .map { }. joinToString(" ") ->. joinToString(" "){ } = 콜 체인 간략화
- .capitalize() ->. replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() } = 함수 변경
두 번째로 가져온 건 withIndex 함수를 이용한 방법입니다. 얘도 신박해서 가져왔습니다.
class Solution {
fun solution(s: String): String {
var answer = ""
for ((index, item) in s.withIndex()) {
if (index == 0 || s[index - 1].toString() == " ") {
answer += item.uppercase().toString()
} else {
answer += item.lowercase().toString()
}
}
return answer
}
}
withIndex()로 문자열을 문자 배열로 변경 후 반복문으로 첫 번째 문자와 공백 다음에 있는 문자만 대문자로 바꿔주는 형식입니다. 이 방법이 제일 좋았던 것은 속도가 가장 빨랐습니다. split을 하지 않아서 그런 거 같습니다.
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
피보나치 수(Lv.2) (0) | 2022.09.18 |
---|---|
이진변환 반복하기(Lv.2) (0) | 2022.09.16 |
최댓값과 최솟값(Lv.2) (1) | 2022.09.14 |
베스트 앨범 (0) | 2022.06.13 |
카펫 (0) | 2022.06.13 |