문제 링크 -> 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를 확인하지 않는다, 문자의 맨뒤에 " "을 붙일 필요가 없다, 따라서 맨 마지막문자를 제거할 필요가 없다. 확실히 코드가 간결해지겠습니다.
역시 다른사람의 문제풀이 후에 성취감도 좋지만, 다른사람의 풀이를 보고 배워가는점 또한 재미있어서 프로그래머스를 끊을 수 가 없습니다...
------------------------------------------------------------결과------------------------------------------------------------------
- 문제에 대한 질문 댓글 환영!
- 중간에 잘못된 부분이 있다면 댓글로 남겨주세요. 수정하겠습니다.
'Kotlin(프로그래머스) > Level 2' 카테고리의 다른 글
[프로그래머스/Kotln] n^2 배열 자르기 (0) | 2022.04.21 |
---|---|
[프로그래머스/Kotlin] 피보나치 수 (0) | 2022.04.19 |
[프로그래머스/Kotlin] N개의 최소 공배수 (0) | 2022.04.18 |
[프로그래머스/kotlin] 가장 큰 수 (0) | 2022.04.17 |
[프로그래머스/Kotlin]거리두기 확인하기 (0) | 2022.04.15 |
댓글