본문 바로가기
알고리즘/Programmers

[TIL] 2023.06.10 Programmers_왼쪽 오른쪽

by heereal 2023. 6. 10.

왼쪽 오른쪽

문제 설명

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

 

 

입출력 예

str_list result
["u", "u", "l", "r"] ["u", "u"]
["l"] []

입출력 예 #1

  • "r"보다 "l"이 먼저 나왔기 때문에 "l"의 왼쪽에 있는 문자열들을 담은 리스트인 ["u", "u"]를 return 합니다.

입출력 예 #2

  • "l"의 왼쪽에 문자열이 없기 때문에 빈 리스트를 return 합니다.

 

나의 1차 풀이

function solution(str_list) {
    const indexL =  str_list.indexOf("l");
    const indexR = str_list.indexOf("r");
    if (indexL === -1 || indexR === -1) return [];
    return indexL < indexR ? str_list.slice(0, indexL) : str_list.slice(indexR + 1);
}

처음에는 문자열 "l"이 없거나 "r"이 없는 상황에 빈 배열을 return 하는 줄 알고 문제를 풀었는데 테스트 케이스 1번 20번을 통과하지 못했다. 그래서 질문하기 페이지를 참고했더니 문자열 "l"과 "r" 모두 없는 상황에 빈 배열을 return하는 문제였다.

 

 

나의 최종 풀이

function solution(str_list) {
    const indexL =  str_list.indexOf("l");
    const indexR = str_list.indexOf("r");
    if (indexL === -1 && indexR === -1) return [];
    if (indexL === -1) return str_list.slice(indexR + 1);
    if (indexR === -1) return str_list.slice(0, indexL);
    return indexL < indexR ? str_list.slice(0, indexL) : str_list.slice(indexR + 1);
}

첫 번째 if문을 && 연산자로 변경하면서 발생한 문제점이 만약 문자열 "l"이 존재하지 않는 경우에 indexL은 -1이 되기 때문에 indexL < indexR을 비교했을 때 indexL의 인덱스가 더 작은 것으로 인식해서 indexL을 기준으로 배열을 slice 하게 된다. 

 

그래서 if문을 추가해서 문자열 "l"이 존재하지 않을 때는 문자열 "r"을 기준으로 문자열을 slice 하고, 반대의 경우까지 추가했다. 너무 if문을 많이 사용해서 예외 처리를 한 거 같아서 풀긴 했지만 그렇게 마음에 드는 풀이는 아니다 🥲

 

 

 

다른 사람의 풀이

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

for문을 사용하면 내 풀이보다 더욱 깔끔한 풀이가 된다. 내 풀이에서는 다섯 가지의 상황에 따라 return 값을 달리 했다면 이 풀이에서는 세 가지 경우만으로 처리할 수 있었다.

 

 

댓글