Algorithm/kotlin

[프로그래머스/Kotlin] JadenCase 문자열 만들기 (Lv. 2)

나연쓰 2024. 3. 27. 14:51

문제

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

 

제한사항

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

 

입출력 예

 

 

풀이방법

1. 주어진 문자열 s를 공백을 기준으로 잘라서 배열에 담는다.

var words = s.split(" ")

 

2. 배열을 하나씩 반복하면서 만약 길이가 0이라면 공백을 추가하고,

    0이 아니라면 숫자인지 영문자인지 체크해야한다.

    체크하는 부분은 isNum이라는 함수를 만들었다.

    함수의 매개변수를 int로 변경했을 때 NumberFormatException이 발생하면 문자라는 의미.

 

3. 만약 숫자라면 숫자를 append하고 숫자가 아니라면 대문자로 변경해서 append한다.

words.forEach{
    if(it.length == 0){
        answer.append(" ")
    }else{
        if(!isNum(it[0].toString())){
            answer.append(it[0].toUpperCase())
        }else{
            answer.append(it[0])
        }
    }
}

 

 

4. 그리고 첫번째를 제외한 나머지 부분은 소문자로 변경해서 append한다.

    한 문자가 끝날 때마다 공백도 추가해줘야한다.

for(i in 1 until it.length){
    answer.append(it[i].toLowerCase())
}
answer.append(" ")

 

5. 여기서 답을 제출하면 오류가 뜬다.

    이유는 answer.append(" ")가 answer의 맨 마지막에도 들어가기 때문

    그래서 마지막 공백은 제거해야한다.

answer.delete(answer.length-1, answer.length)

 

주의할 점

테스트 케이스
" a b "

return
" A B "

 위의 테스트 케이스에 공백을 기준으로 split 하면 [, a, b, ] 와 같이 공백도 담긴다.

그렇기 때문에 if(it.length == 0) 이 조건이 없다면 오류가 발생하므로 주의할 것 !

 

코드

class Solution {
    fun solution(s: String): StringBuilder {
        var answer = StringBuilder()
        
        var words = s.split(" ")
        println(words)
        words.forEach{
            println(it)
            if(it.length == 0){
                answer.append(" ")
            }else{
                if(!isNum(it[0].toString())){
                    answer.append(it[0].toUpperCase())
                }else{
                    answer.append(it[0])
                }

                for(i in 1 until it.length){
                    answer.append(it[i].toLowerCase())
                }
                answer.append(" ")
                }
        }
        
        answer.delete(answer.length-1, answer.length)
        return answer
    }
    
    fun isNum(c: String): Boolean{
        return try{
            c.toInt()
            true
        }catch(e: NumberFormatException){
            false
        }
    }
}

 

 

 

 

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr