본문 바로가기
Kotlin(프로그래머스)/Level 2

[프로그래머스/Kotlin] JadenCase 문자열 만들기

by Yuno. 2022. 4. 18.
728x90

문제 링크 -> https://programmers.co.kr/learn/courses/30/lessons/12951#

 

코딩테스트 연습 - JadenCase 문자열 만들기

JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 쓰면 됩니다. (첫 번째 입출력 예 참고

programmers.co.kr

문제 설명

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

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

------------------------------------------------------------풀이------------------------------------------------------------------
- 주의사항 : 입력받은 " "문자열 또한 그대로 나와야 한다. 

ex)
입력 : "  my   a  name is yunho AAaA    "
출력 : "  My   A  Name Is Yunho Aaaa    "

위에 써놓은 주의사항 때문에 좀 애먹었습니다.. 내가 놓친게 뭐지 하고 꽤 고민했네요. 입출력의 예에서 연속된 공백문자에 대한 예가 주어지지않아서 놓친것 같습니다. 먼저 풀이부터 정리하겠습니다.

1. 주어진 문자열 s를 " "으로 split한다.
2. map을 사용해서 각 원소를 돌며 원소의 length>0일 때 length에 따라 문자열을 조건대로 바꿔준 후 맨뒤 " "을 하나 더 붙여준다. 
3. 원소의 length가 0이라면 해당 원소를 " "으로 바꾸어준다.
4. jointToString으로 배열 원소들을 String으로 합쳐준후 마지막 문자를 제거합니다. 
 * 문자의 뒤에 " "을 붙여주기 때문에 마지막 문자는 필요없는 " "이 한개 딸려와서 그것을 제거해주는 것입니다. 
먼저 풀이 코드입니다. 

class Solution {
    fun solution(s: String): String = s.split(" ").map{
        if( it.length > 0){
            when(it.length){
                1->it.uppercase() + " "
                else -> it.substring(0,1).toUpperCase() + it.substring(1,it.length).toLowerCase() + " "
            }
        }
        else " "
    }.joinToString("").substring(0, s.length)
}

불통된 코드입니다. 

class Solution4 {
    fun solution(s: String): String = s.split(Regex(" +")).map{
        when(it.length){
            0 -> it
            1 -> it.toUpperCase()
            else -> it.substring(0,1).toUpperCase() + it.substring(1, it.length).toLowerCase()
        }
    }.joinToString(" ")
}

Regex로 연속된 공백을 구분자로하여 split하였습니다. 이렇게되면 아래와 같은 결과를 낳게됩니다.

입력 : "  my     name is yunho AAaA    "
출력 : " My Name Is Yunho Aaaa "

여러개의 공백문자가 1개로 줄어버렸습니다. 이부분을 놓쳐서 많이 헤메버렸네요.. 
하지만! 문제를 풀고 새로 알게된것이 있습니다. 문제를 풀고 다른사람 풀이를 보았는데

capitalize()

라는 함수를 호출하시더라구요. 이게 뭔가 알아보았더니 문자열의 맨 앞자리를 대문자로 바꿔주는 함수입니다. 
저걸 사용한 분의 로직은 
1. 모든 문자 소문자로 변경 
2. " "으로 split
3. map으로 각 원소에 대해 captoalize를 호출하여 맨 앞문자를 대문자 변경
4. joinToString(" ")으로 String으로 결합 

저와 다른점은 각 문자의 length를 확인하지 않는다, 문자의 맨뒤에 " "을 붙일 필요가 없다, 따라서 맨 마지막문자를 제거할 필요가 없다. 확실히 코드가 간결해지겠습니다. 

역시 다른사람의 문제풀이 후에 성취감도 좋지만, 다른사람의 풀이를 보고 배워가는점 또한 재미있어서 프로그래머스를 끊을 수 가 없습니다...

------------------------------------------------------------결과------------------------------------------------------------------

- 문제에 대한 질문 댓글 환영!
- 중간에 잘못된 부분이 있다면 댓글로 남겨주세요. 수정하겠습니다.

728x90

댓글