function solution(s) {
let stack = [];
for(let i = 0; i < s.length; i++){
if(s[i] === " "){
stack.push(s[i]);
continue;
}
if(!Number.isNaN(Number(s[i]))){
stack.push(s[i]);
continue;
}
if(i === 0){
stack.push(s[i].toUpperCase());
continue;
}
if(stack[stack.length - 1] === " "){
stack.push(s[i].toUpperCase());
} else {
stack.push(s[i].toLowerCase());
}
}
return stack.join("");
}
약간 막무가내로 작성한 코드이다.
우선, 공백을 확인한다.
공백은 이어져서 등장할 수도 있다는 점을 주의하며,
Number()
로 바꿨을 때 0
이 된다는 점도 주의해야한다.
따라서, 가장 먼저 처리하며, 그대로 stack
에 넣는다.
다음으로는, 숫자 문자열에 관한 처리이다.
만약, 숫자 문자열을 Number()
로 변환하면 Number.isNaN()
에서 false
가 나온다.
입력으로 주어진 문자열은 공백과 소문자, 대문자, 숫자 문자열 뿐이므로
Number.isNaN()
을 통해 숫자 문자열만 판별할 수 있다.
공백 문자를 먼저 처리한 것도 이를 사용하기 위해서이다.
숫자 문자열은 그대로 stack
에 넣는다.
다음으로는, 일반 문자열들이다.
만약, 입력된 문자열의 가장 앞에 있는 문자라면 대문자로 변환하고,
입력된 문자열이의 가장 앞이 아닌 문자인데, 그 문자 앞에 공백이 있다면 대문자로 변경한다.
나머지 경우에는 소문자로 변경하여 stack
에 넣는다.
마지막으로, stack
에 들어있는 문자열을 하나로 묶어서 반환한다.
function solution(s) {
return s.split(" ").map(v => v.charAt(0).toUpperCase() + v.substring(1).toLowerCase()).join(" ");
}
음...처음 보는 메서드가 많이 사용됐고, 상당히 빠르기도 해서 가져와봤다.
방법은 다음과 같다.
우선, 입력 문자열은 공백을 기준으로 나눌 수 있다.
하나의 덩어리가 된 문자열은 가장 앞이 대문자가 되어야한다.
toUpperCase()
는 알파벳은 대문자로 변환하지만, 숫자 문자열은 그대로 숫자 문자열로 반환된다.
숫자 문자열 처리를 굳이 신경 쓰지 않아도 된다는 것이다.
따라서, charAt()
을 사용하여 하나의 덩어리가 된 문자열의 가장 앞 문자를 대문자로 변환하고,
subString()
을 사용하여 1
번 인덱스(가장 앞에서 바로 뒤)부터 가장 끝까지 반환한 뒤,
해당 문자열을 toLowerCase()
를 활용해 소문자로 바꾼다.
마찬가지로 숫자 문자열은 신경 쓰지 않아도 된다.
그렇게 map()
이 연산 종료되면 반환된 처리된 문자열들의 배열을 join()
으로 합쳐주면 된다.
여기서 잠깐 헷갈릴 수 있는 부분!
공백 문자의 경우 연속되게 주어질 수 있는데,
join(" ")
으로 하면 공백 문자는 어떻게 처리되는지 헷갈린다.
그래서 간단하게 실험을 해봤다.
두 번 연속으로 등장하는 공백 문자를 공백 문자로 split()
을 하는 경우이다.
// 예시 입력
"3people unFollowed me".split(" "); // ['3people', 'unFollowed', 'me']
// 예시 입력값 공백 문자에 공백 문자 하나 더 이은 것. 즉 공백 문자를 2개씩 넣어놨다.
"3people unFollowed me".split(" "); // ['3people', '', 'unFollowed', '', 'me']
그렇다. 연속되는 공백 문자를 공백 문자로 나누면 빈 문자열이 등장하게 된다.
따라서, map()
에서 v
라는 파라미터로 사용되는 공백 문자는 작성해준 처리 과정을 거쳐
빈 문자열로 반환되게 된다.
사라지는게 아니라 공백과 공백 사이가 빈 문자열로 반환되기 때문에, 존재한다는 것이 핵심이다.
이 덕분에 join()
에서 빈 문자열과 다른 문자열 사이를 공백으로 이어줄 수 있는 것이다.