[js] 왼쪽 오른쪽 (lv.0, 정답률 81%)

sookyoung.k·2024년 5월 10일
0
post-thumbnail

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

제한사항

  • 1 ≤ str_list의 길이 ≤ 20
  • str_list는 "u", "d", "l", "r" 네 개의 문자열로 이루어져 있습니다.

나의 풀이

function solution(str_list) {
    let left = str_list.findIndex((v) => v === 'l');
    let right = str_list.findIndex((v) => v === 'r');
    
    if (left == -1 && right == -1) return [];
  // && 조건 안 줘서 틀림
    else if (left !== -1 && (left < right || right === -1)) return str_list.slice(0, left);
  // +1을 안 해서 틀림 
    else return str_list.slice(right +1);
}

이것도 상당히 복잡하게 풀었는데 다른 사람 풀이 보니까 약간 허탈해짐 ㅎㅎ

  • findIndex() 메서드를 통해서 l이라는 글자가 처음 등장하는 인덱스와 r이라는 글자가 처음 등장하는 인덱스를 찾아 left, right에 각각 할당한다.
  • 그리고 조건문을 통해서 하나씩 해결했다.
    • 먼저 left와 right의 값이 둘 다 -1일 경우(등장하지 않음)에는 빈배열을 리턴한다.
    • 다음으로 left 값이 존재하면서, left가 right보다 더 작거나 right가 존재하지 않을 때 원본 배열을 slice() 메서드를 통해 0부터 left 이전까지의 인덱스를 잘라 리턴해준다.
    • 나머지 경우 (right 값이 존재하면서, right가 left보다 더 작거나 left가 존재하지 않을 때) 원본 배열을 right번째 인덱스 이후부터(+1) 잘라서 리턴해준다.

이번 문제를 풀 때는 조건문을 잘 쓰는 것이 중요했다. 머리를 잘 써서 조건을 나눠야 하는데 약간 힘들었슴…

다른 풀이 1

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문을 돌면서 0부터 원본 배열의 길이만큼 i를 돌린다.
    • 먼저 i번째 인덱스가 l일 경우, 그러니까 l을 먼저 발견했을 경우 slice() 메서드를 사용해 바로 리턴
    • i번째 인덱스가 r일경우, r을 먼저 발견했을 경우 이하 동문
  • 조건에 해당하는 인덱스가 없을 경우 빈 배열 리턴

이렇게 훨씬 간단하게 줄일 수 있다니!

다른 풀이 2

function solution(str_list) {
  const i = str_list.findIndex((str) => /l|r/.test(str));
  if (i === -1) {
    return [];
  }
  return str_list[i] === 'l' ? str_list.slice(0, i) : str_list.slice(i + 1);
}

풀이는 다른 것과 같지만, 신기한 메서드가 있어서 가져와봤다!

RegExp.prototype.test()

test() 메서드는 주어진 문자열이 정규 표현식을 만족하는지 판별하고, 그 여부를 true 또는 false로 반환합니다.

정규표현식 메서드를 사용해서 인덱스 번호를 구했다.

친구의 풀이

function solution(str_list) {
    const idx = str_list.findIndex(c => c === 'l' || c === 'r')
    return idx === -1 
        ? [] 
        : str_list[idx] === 'l' 
        ? str_list.slice(0, idx) 
        : str_list.slice(idx+1)
}

간단해 보이는 것을 너무 어렵게 끙끙 앓다가 풀어낸 거라 같이 스터디하는 친구의 풀이가 궁금해서 살짝 훔쳐와봤다.

와 역시…

  • findIndex를 통해서 찾는 건 맞는데 || 연산자를 사용해서 변수를 두 개나 선언하지 않고 한 번에 해결했다. 어차피 둘 중 하나 먼저 나오는 것이 무엇인지가 중요한 거니까!
  • 그리고 바로 리턴… idx가 -1일 경우 빈배열, 그리고 나머지는 위와 같이 삼항 연산자를 통해서 리턴해준다.

와 이런 풀이도 배워야함… 머싯다 울 언니…

profile
영차영차 😎

0개의 댓글