반응형
문제:
문자열 리스트 str_list에는 "u", "d", "l", "r" 네 개의 문자열이 여러 개 저장되어 있습니다. 
str_list에서 "l"과 "r" 중 먼저 나오는 문자열이 "l"이면 해당 문자열을 기준으로 왼쪽에 있는 문자열들을 순서대로 담은 리스트를,
먼저 나오는 문자열이 "r"이라면 해당 문자열을 기준으로 오른쪽에 있는 문자열들을 순서대로 담은 리스트를 return하도록 solution 함수를 완성해주세요. "l"이나 "r"이 없다면 빈 리스트를 return합니다.

 

문제 풀어보기: https://school.programmers.co.kr/learn/courses/30/lessons/181890?language=javascript#

 

풀이보기
더보기
function solution(str_list) {
    let wordL = str_list.indexOf('l');
    let wordR = str_list.indexOf('r');

    if(wordL === -1 && wordR === -1) return [];
    
    if(wordL < wordR && wordL !== -1 || wordR === -1) {
        return str_list.slice(0, wordL);
    } else if(wordL > wordR && wordR !== -1 || wordL === -1) {
        return str_list.slice(wordR + 1);
    }
  }

처음에는 단순히 인덱스 번호로 큰지 작은지 비교한 후 slice하면 되겠지라는 생각으로 작성해보았다.

먼저 l과 r이 둘 다 없으면 indexOf에서 -1을 반환하므로 이를 확인하여 빈 배열을 반환해주도록 하고,

그게 아니라면 두 인덱스 번호를 비교해서 문제대로 배열을 잘라주었다.

근데 다른 사람 풀이를 보니 내가 굉장히 하드코딩을 했다는 생각이 들었다 ㅎㅎ;

 

function solution(str_list) {  
    for(let i = 0; i < str_list.length; i++) {
        if(str_list[i] === 'l') return str_list.slice(0, i);
        if(str_list[i] === 'r') return str_list.slice(i + 1);
    }
    
    return [];
}

이렇게 반복문을 사용하면 먼저 나오는 문자에 따라 slice가 실행되고,

반복을 다 해도 해당 문자가 없다면 반복문을 나가서 빈 배열을 리턴해주면 된다.

만약 배열의 길이가 길 경우에도 indexOf를 사용하면 배열을 2번 순회해야하기 때문에 비효율적이다.

for문은 한 번만 순회하면 되기 때문에 두번째 코드가 더 효율적이라고 할 수 있다.

 

반응형

+ Recent posts