Level2️⃣ - JadenCase 문자열 만들기

2024. 3. 27. 00:43알고리즘/프로그래머스

https://school.programmers.co.kr/learn/courses/30/lessons/12951

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제를 이해하는 것은 어렵지 않았으나 구현 과정에서 부끄러움을 많이 느낀 문제이다.

가장 시간을 많이 소비한 부분은 두 곳이다.

첫번째는 문자열의 앞글자가 대문자로 바뀌지 않아서 시간을 많이 소비했다.

let str = 'abcde';
console.log(str[0]); // a
str[0] = 'z';
console.log(str); // abcde

문자열을 인덱스로 접근해서 변경하려해도 문자열은 변경되지 않는다. 문자열은 불변한 데이터 타입이기 때문이다.

문자열 자체의 변경이 있는 경우에만 변경이 된다. 

str = "hello";

이렇게 문자열에 새로운 문자열을 대입하면 기존값인 abcde는 불변한 값으로 변경되지 않지만, 새로운 hello를 담는 메모리 영역을 확보하고 str이 그 영역의 주소값을 가리키게된다.

function solution(s) {
    let a = s.split(" ").map((ele)=> [...ele].map((c)=>c.toLowerCase()).join(""));
    a = a.map((ele)=>{
        if(ele.length && Number.isNaN(Number(ele[0]))) {
            let t = [...ele];
            t.splice(0, 1, ele[0].toUpperCase());
            return t.join("");
        }
        return ele;
    });
   
    return a.join(" ");
}
let t = [...ele];
t.splice(0, 1, ele[0].toUpperCase());

그렇기 때문에 스프레드 연산자로 배열로 변경한 후, splice 메서드로 대문자로 교체해주었다.

 

그리고 split 메서드에 대해 정확히 알지 못해서 시간이 오래걸렸다.

"Hello  World" 라는 문자열이 있다. 공백은 사이에 두 개가 존재한다. 이 문자열을 split(" ") 공백 한칸으로 split하면 어떻게 될까?

공백 한 칸을 기준으로 문자열을 분리하는 것이기 때문에 다음과 같이 Hello와 World 사이에 빈 문자열이 생기게 된다.

만일 공백 두 칸으로 split을 하게 되면? [ "Hello, "World" ] 이렇게 분리된다.

따라서 문제 조건에서 공백이 연속해서 올 수 있다고 했는데 공백 한 칸으로 split을 하게되면 빈 문자열이 생기게 된다.

if(ele.length && Number.isNaN(Number(ele[0])))

그리고 이 조건에서 ele.length를 체크하는 조건이 없다면 즉, 빈 문자열을 필터링하지 않는다면?

 

let t = [...ele];
t.splice(0, 1, ele[0].toUpperCase());
return t.join("");

빈 문자열이래서 어떤 요소도 없는데 첫번째 요소를 대문자화 하려고 하니 에러가 발생한다.

따라서 빈 문자열을 거르는 조건을 반드시 추가해줘야한다.

 

  • 문자열은 불변값이므로 인덱싱으로 변환할 수 없다. 문자열 자체를 변경해야한다.
  • split(기준점)은 기준점을 중심으로 문자열을 나눈다.