처음 작성한 코드
function solution(s) {
var answer = '';
let sSplit = s.split(' ')
for (let i = 0; i < sSplit.length; i++) {
let targetWord = sSplit[i]
for (let j = 0; j < targetWord.length; j++) {
let targetAlphabet = targetWord[j]
if (j === 0) {
answer += targetAlphabet.toUpperCase()
} else {
answer += targetAlphabet.toLowerCase()
}
}
answer += ' '
}
return answer.trim();
}
들어온 문자열을 띄어쓰기 기준으로 나눠주고
나눠진 단어를 알파벳별로 나누어 첫 글자만 대문자로, 나머지는 소문자로 만들어 answer에 그대로 넣는 방식이다.
그리고 마지막에 띄어쓰기가 더해져 trim으로 제거하였다.
8번 케이스가 실패했다.
아마도 띄어쓰기가 문제인것으로 생각된다.
띄어쓰기가 연속해서 나오게 되면 split할 때에 빈 문자열이 sSplit배열에 들어가기 때문이라고 생각하며, s로 들어온 문자열 중 단어의 맨 앞만 대문자, 나머지 단어는 소문자로 바꿔야한다.
예를 들어 ' abc def '가 들어온다면 ' Abc Def '이렇게 리턴해야하는 것이 문제라고 생각한다.
두번째로 작성한 코드
function solution(s) {
var answer = '';
for (let i = 0; i<s.length; i++) {
let targetAlphabet = s[i]
if (i === 0 && targetAlphabet !== ' ') {
answer += targetAlphabet.toUpperCase()
continue;
}
if (targetAlphabet === ' ') {
answer+= ' '
continue;
}
if (targetAlphabet !== ' ' && s[i-1] !== ' ') {
answer+= targetAlphabet.toLowerCase()
continue;
}
if (targetAlphabet !== ' ' && s[i-1] === ' ') {
answer+= targetAlphabet.toUpperCase()
continue;
}
}
return answer;
}
반복문을 만들어주고 해당 반복의 알파벳을 잡아준다.
만약 문자열의 첫 알파벳일때 띄어쓰기가 아니라면, 대문자로 answer에 더해주고 다음 반복으로 넘어간다.
만약 해당 알파벳이 띄어쓰기일경우 띄어쓰기를 answer에 더해주고 다음 반복으로 넘어간다.
만약 해당 알파벳이 문자이고, 이전 알파벳이 문자일경우 소문자를 answer에 더해주고 다음 반복으로 넘어간다.
만약 해당 알파벳이 문자이고, 이전 알파벳이 띄어쓰기일 경우 대문자를 answer에 더해주고 다음 반복으로 넘어간다.
뭔가 깔끔하게 if else문으로 나눌 수 있을 것 같은데 떠오르질 않는다.