
JadenCase 문자열 만들기
문제 설명
JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다.
문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요.제한 조건
- s는 길이 1 이상인 문자열입니다.
- s는 알파벳과 공백문자(" ")로 이루어져 있습니다.
- 첫 문자가 영문이 아닐때에는 이어지는 영문은 소문자로 씁니다. ( 첫번째 입출력 예 참고 )
입출력 예
s return "3people unFollowed me" "3people Unfollowed Me" "for the last week" "For The Last Week"
function solution(s){
var answer = ''
var temp = s.toLowerCase().split('')
for(var i=0; i<temp.length; i++){
var check_eng = /[a-zA-Z]/
if(check_eng.test(temp[i])){
temp[0] = temp[0].toUpperCase()
if(temp[i-1] == ' '){
temp[i] = temp[i].toUpperCase()
}
}
}
answer = temp.join('')
return answer
}
먼저 연속된 공백이 있을 수 있다는 예외사항을 생각해주어야 한다.
나는 이 부분을 생각하지 못해서 몇 번의 실패를 맛봐야 했다 ㅠㅠ
출처 - 질문하기
문제 풀이 시 체크 사항(조건)
지문이 조금 애매하고 제한된 테스트케이스로 저와같이 헷갈려하시는 분들이 많아 몇 가지 체크사항을 말씀드리겠습니다.
제한 조건에는 주어진 문자열 s가 영문자와 공백으로 이루어져있다고 했지만 테스트케이스 예시에는 숫자가 포함되는(3people)경우가 있습니다. 저 같은 경우 그냥 모든 문자가 가능 하다고 가정하고 풀었습니다. (실제로 문제 풀이에는 큰 영향을 미치지 않았습니다.)
연속된 공백이 가능합니다. 예를 들면
Hello(공백)World,Hello(공백)(공백)World가 가능합니다.제가 가장 헷갈렸던 부분입니다. 제한조건에서는
첫 문자가 영문자가 아닐 경우 이어지는 영문은 소문자로 씁니다.라고 하여 만일 연속된 공백으로 이루어진 문자열이 있을 때, 이 연속된 공백도 문자로 봐야할 것인지의 문제입니다.즉, 두개의 문자열 사이에 공백이 연속되는 경우, 연속된 공백을 어떻게 바라보느냐에 따라 이어지는 문자열의 시작을 대문자로 할지 소문자로 할지 애매합니다.
예를들면
hello(공백)my(공백)(공백)friend라는 문자가 들어왔다고 가정 할 때, 이 문자열을Hello(공백)My(공백)(공백)Friend로 치환해야 할지,Hello(공백)My(공백)(공백)friend로 치환해야 할지 애매하다는 겁니다. 여기서 연속된 공백은 문자로 바라보지 않습니다. 즉, 전자와 같이 출력해야 원하는 결과를 얻으 실 수 있습니다. (저는 후자와 같이 출력하게끔 문제를 풀어서 코드 문제인지 개고생했네요)
따라서 나의 알고리즘은 다음과 같다.
- s로 들어온 모든 문자열을 소문자로 바꾼 후 split 하여 배열로 만든다.
- 영문자의 경우에만 대문자로 바꿔주어야 하니까
2-1. 영문자 체크를 한다.
2-2. 영문자가 맞고 만약 배열의 첫 번째 원소라면 무조건 대문자여야 하니까 대문자로 바꾼다.
2-3. 영문자가 맞고 만약 이전에 있는 원소가 공백이었다면 이 원소는 단어의 첫 문자가 되니까 대문자로 바꾼다.- 이를 join하여 answer에 담아 반환한다.
이렇게하면, 기존의 공백 조건도 무너지지 않으면서 단어의 첫 문자만 대문자로 바꾼 채 return할 수 있게 된다.
사실 나는 연속된 공백을 생각하지 못해 공백을 기준으로 split을 시도했다.
그래서 예제 테스트는 통과하는데, 채점해서 무수한 실패를 만났다 ㅜㅜ... 질문하기 글을 보지 않았으면 풀지 못했을 것 !
s의 공백 위치와 개수를 지키면서 단어의 첫 문자만 대문자로 바꾸는 방법에 대해 또 은근히 복잡하게 생각했다. 좀 더 단순히 사고하는 능력을 기르자 ! ㅜ_ㅜ