[Node.js_6기 본캠프] Today I Learned_0820

2024. 8. 20. 12:52[Node.js_6기 본캠프 TIL]

▶ 알고리즘 코드카타(JavaScript) - 이상한 문자 만들기

 

1) 주어진 코드

function solution(s) {
    var answer = '';
    return answer;
}

 

2) 조금 슬픈 이야기

예시만 보고 for문 하나만 걸면 되는 거 아닌가? 라는 속 편한 생각을 했다. 일단 대문자/소문자로 치환하는 함수를 모르기 때문에 구글링부터 시작. toUpperCase()와 toLowerCase()의 사용법을 찾으면서 비슷한 문제를 푼 사람들의 풀이가 살짝 보였다. 뭔가 잘못되었음을 깨달았지만, 애써 흐린눈을 하고 처음부터 하나씩 풀어보기로 했다. 오늘 강의에서 분명 알고 있는 것 같은 함수들도 노트에 써보려니 완성하지 못하는 걸 보고 내 실력의 얄팍함에 충격 받았기 때문에 되는 데까지는 어떻게든 풀어보기로 했다. 

function solution(s) {
    var answer = '';
    for(let i = 0; i < s.length; i++){
        if(i%2 === 0){
            answer += s[i].toUpperCase();
        } else {
             answer += s[i].toLowerCase();
        }
    }
    return answer;
}

 

처음 생각했던 코드를 완성했다. 테스트 케이스 1개는 무사 통과되는 것을 보고 제출했으나... 케이스가 늘어나자 줄줄이 실패가 떴다. 아무래도 '공백을 기준'으로 변환해야 하는 걸 놓쳐서 발생한 문제 같았다.

 

그러면 단어별로 쪼개야 하는데, 단어의 글자를 하나씩 쪼개본 적은 있어도, 공백을 기준으로 쪼개본 적은 없어서 또 한참 고민했다. split('')로만 써오던 걸, split(' ')으로 써주면 공백 기준으로 분리할 수 있었다. 역시 원리를 알고 써야 응용이 되는데, 쉽지 않다.

function solution(s) {
    let arr = s.split(' ');  
    let str = '' ; 
    let answer = ''; 
    
    for(let i = 0; i < arr.length; i++){  
        str = arr[i];  
        for(let j = 0; j < str.length; j++) 
        if(j%2 === 0){
            answer += str[j].toUpperCase();  
        } else {
             answer += str[j].toLowerCase();  
        }
    }
    return answer;
}

 

이번에는 테스트 케이스도 통과하지 못했기 때문에,  눈 딱 감고 다른 풀이들을 정독해보기로 했다. 놀랍게도 split 과정에서 사라진 띄어쓰기를 놓치고 있었다는 것을 깨달았다.

 

3) 풀이

 

function solution(s) {
    let arr = s.split(' ');  // 공백을 기준으로 분리된 단어들을 배열 형태로 저장
    let str = '' ;  // 분리된 단어들을 하나씩 가공할 때 쓸 변수 선언
    let answer = ''; 
    
    for(let i = 0; i < arr.length; i++){  // 배열의 길이 만큼 반복
        str = arr[i];  // s를 분리한 배열, arr의 i 번째 단어를 str이라고 한다
        for(let j = 0; j < str.length; j++) // 단어 길이 만큼 반복
        if(j%2 === 0){
            answer += str[j].toUpperCase();  // 짝수 자리면 대문자로 변환하여 answer에 넣기
        } else {
             answer += str[j].toLowerCase();  // 홀수 자리면 소문자로 변환하여 answer에 넣기
        }
          answer += " "; // arr 선언 과정에 사라진 띄어쓰기 다시 넣어주기
    }
    
    // for문에서 나오는 과정에 마지막 단어 뒤에 불필요하게 붙은 띄어쓰기 없애주기
    answer = answer.substr(0,answer.length-1); 
    
    return answer;
}

 

참고 링크: https://frontend-manchoon.tistory.com/41