[Node.js_4기] 알고리즘 : JadenCase 문자열 만들기 (24/02/21)

2024. 2. 21. 21:07공부/코테준비

목차

 

1. 문제

2. 시도

3. 결과

4. 배운점

 

1. 문제 

 

코딩테스트 연습 - JadenCase 문자열 만들기 | 프로그래머스 스쿨 (programmers.co.kr)

 

2. 시도 

function solution(s) {
    let answer = "";
    let _s = s.split(' ')
    for(let i of _s){
        let newi = i.replace(i[0], char => char.toUpperCase());
        answer += newi + " "
    }
    answer = answer.substring(0,answer.length - 1)
    return answer;
}
테스트 1
입력값 "3people unFollowed me"
기댓값 "3people Unfollowed Me"
실행 결과 실행한 결괏값 "3people UnFollowed Me"이 기댓값 "3people Unfollowed Me"과 다릅니다.

두번째 단의 "unFollowed"에서 첫번째 글자만 대문자가 되어 기대값이 달라졌다. 이 부분만 수정하면 된다.

테스트 2
입력값 "for the last week"
기댓값 "For The Last Week"
실행 결과 테스트를 통과하였습니다.

 

function solution(s) {
    let answer = "";
    let _s = s.split(' ')
    for(let i of _s){
        i = i.toLowerCase();
        let newi = i.replace(i[0], char => char.toUpperCase());
        answer += newi + " "
    }
    answer = answer.substring(0,answer.length - 1)
    return answer;
}

 

1. 문자열을 공백을 기준으로 나눈 새로운 배열을 생성.

2. 나누어진 문자열 객체에서 하나의 요소를 모두 소문자로 만든 뒤, 그 첫번째 문자를 대문자로 고친다음 answer에 더하고 맨 뒤에 공백을 추가한다.

3.  가장 마지막의 공백은 필요 없으므로 suvstr해서 제거한다.

 

3. 결과 

테스트 1
입력값 "3people unFollowed me"
기댓값 "3people Unfollowed Me"
실행 결과 테스트를 통과하였습니다.
테스트 1 통과 (0.07ms, 33.5MB)
테스트 2 통과 (0.08ms, 33.5MB)
테스트 3 통과 (0.08ms, 33.5MB)
테스트 4 통과 (0.09ms, 33.4MB)
테스트 5 통과 (0.13ms, 33.5MB)
테스트 6 통과 (0.08ms, 33.6MB)
테스트 7 통과 (0.12ms, 33.5MB)
테스트 8 통과 (0.08ms, 33.4MB)
테스트 9 통과 (0.14ms, 33.6MB)
테스트 10 통과 (0.07ms, 33.5MB)
테스트 11 통과 (0.09ms, 33.4MB)
테스트 12 통과 (0.08ms, 33.4MB)
테스트 13 통과 (0.08ms, 33.6MB)
테스트 14 통과 (0.08ms, 33.5MB)
테스트 15 통과 (0.09ms, 33.4MB)
테스트 16 통과 (0.07ms, 33.5MB)
테스트 17 통과 (0.08ms, 33.2MB)
테스트 18 통과 (0.07ms, 33.2MB)

 

프로그래머스 lv2 초입은 그럭저럭 어렵지 않은 문제들이 포진되어 있어 1레벨 정답률 50퍼 미만의 문제들보다 쉽게 느껴진다.

 

4. 배운점 

검색을 했을때 가장 인상적이였던 코드는 아래와 같다.

function solution(s) {
    var answer = '';
   let result = s.split(' ');

   let result2 = result.map(x=> x.charAt(0).toUpperCase() + x.slice(1).toLowerCase());

   answer = result2.join(" ")
    return answer;
}

1. 문자열을 공백을 기준으로 나눈 새로운 배열 생성. << 여기까진 동일하다.

2. for문을 사용하지 않고 map을 사용한다.

배열 내부의 값을 조건에 밎게 변형시키고 새로운 배열을 뽑아내서 result2에 저장

   let result2 = result.map(x=> x.charAt(0).toUpperCase() + x.slice(1).toLowerCase());


charAt(): result2의 각각 배열값인 x에 대하여 0번째 글자를 선택
toUpperCase(): 0번째에 대한 글자를 대문자로 변환
slice(): slice(1)을 통해 인덱스가 1값부터 마지막값까지를 설정
toLowerCase(): 인덱스값이 1인 부분부터는 소문자로 변환

3. join(): 배열의 모든 요소를 연결해 하나의 문자열로 변환

 

내가 짠 코드와의 주요한 차이는 for문대신 map을 사용하여 성능을 높였다는 것과,

공백을 추가하고 나중에 공백을 제거하는 대신 join할 때 공백을 넣어 합쳤다는 차이가 있다.

 

function solution(s) {
    let _s = s.split(' ')
        .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
        .join(" ");
    return _s;
}

작정하고 줄이면 거의 한줄로 줄일 수 있었다.