알고리즘

[알고리즘] 프로그래머스 Lv.1 - 이상한 문자 만들기(JS)

로돌씨 2024. 3. 11. 18:38

 

문제 설명
문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.

 

제한 사항
문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.

 

 

내가 풀었던 오답

function solution(s) {
    //단어들을 공백을 기준으로 떨어뜨려 그 단어의 인덱스가 짝수라면 대문자로 , 아니라면 소문자로 변형하여 출력
    var arr = [];
    //공백을 기준으로 단어를 떨어뜨리고
    var stringArr = s.split(" ")
        //각 떨어진 단어를 word 배열에 추가후 word를 스프레드 연산자로 하나씩 떼줌
        for(let i = 0; i < stringArr.length; i++){
            var word = stringArr[i];
            var spliteWord = [...word];
            //반복문을 이용해 떨어진 단어의 인덱스가 짝수라면 대문자 아니라면 소문자로 변경후 arr 배열에 다시 추가해줌
            for (let j = 0; j<spliteWord.length; j++){
                if(j % 2 === 0){
                arr.push(spliteWord[j].toUpperCase())
                }else if(j % 2 !== 0){
                    arr.push(spliteWord[j].toLowerCase())
                }
            }
            //단어마다의 과정을 마쳤다면 공백을 다시 추가해준 후
            arr.push(" ")
        //trim을 이용해 필요없는 앞뒤의 공백을 없애주었음
        }
    return arr.join("").trim();
    
}

아마 뒤에 공백을 제거하겠다고 문자열로 만든 후 trim을 쓴것이 문제였던것 같다 . 

 

수정한코드

function solution(s) {
    var arr = [];
    var stringArr = s.split(" ");

    for (let i = 0; i < stringArr.length; i++) {
        var word = stringArr[i];
        var spliteWord = [...word];
        for (let j = 0; j < spliteWord.length; j++) {
            if (j % 2 === 0) {
                arr.push(spliteWord[j].toUpperCase());
            } else {
                arr.push(spliteWord[j].toLowerCase());
            }
        }
        // 각 단어 사이에 공백 추가
        arr.push(" ");
    }
    // 마지막 공백 제거
    arr.pop();
    return arr.join("");
}

join을 하기전 배열의 끝부분을 제거하는 pop() 함수를 사용하니 정상적으로 테스트케이스를 통과하였다!

 

다른사람의 풀이

function toWeirdCase(s){
  //함수를 완성해주세요
  return s.toUpperCase().replace(/(\w)(\w)/g, function(a){return a[0].toUpperCase()+a[1].toLowerCase();})

}

 

속도는 느리지만 코드의 양이 현저히 줄어든 것이 보인다. 정말... 경이롭다