2024. 3. 27. 00:43ㆍ알고리즘/프로그래머스
https://school.programmers.co.kr/learn/courses/30/lessons/12951
문제를 이해하는 것은 어렵지 않았으나 구현 과정에서 부끄러움을 많이 느낀 문제이다.
가장 시간을 많이 소비한 부분은 두 곳이다.
첫번째는 문자열의 앞글자가 대문자로 바뀌지 않아서 시간을 많이 소비했다.
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(기준점)은 기준점을 중심으로 문자열을 나눈다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
Level2️⃣ - 피보나치 수 (0) | 2024.03.27 |
---|---|
Level2️⃣ - 숫자의 표현 (0) | 2024.03.27 |
프로그래머스 L1 - 예산 (0) | 2024.03.26 |
프로그래머스 L1 - 체육복 (0) | 2024.03.25 |
프로그래머스 L1 - 숫자 문자열과 영단어 (0) | 2024.03.24 |