[프로그래머스 | Javascript] JadenCase 문자열 만들기

박기영·2023년 1월 12일
0

프로그래머스

목록 보기
113/159
post-custom-banner

solution

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()에서 빈 문자열과 다른 문자열 사이를 공백으로 이어줄 수 있는 것이다.

profile
나를 믿는 사람들을, 실망시키지 않도록
post-custom-banner

0개의 댓글