TIL(05/26/22) - Array.prototype.every()

Jay Yu·2022년 5월 26일
0

배열 메소드 every 파헤치기

every를 파헤치게 된 계기 : 오늘자 알고리즘 문제를 어떻게 접근할지에 대해 고민하다가 '예전에 이런 메소드가 있었던 거 같은데' 하고 구글링을 하다보니 제로초 사이트에 역시나 소개가 되어있었다. 결국 every 메소드를 활용해서 문제를 풀 수 있었고, 잊지 않기 위해 기록하고자 한다.

알고리즘 문제 소개

_strs은 단어가 담긴 배열입니다. 공통된 시작 단어(prefix)를 반환해주세요._

예를 들어 strs = ['start', 'stair', 'step'] return은 'st'

strs = ['start', 'wework', 'today'] return은 ""

초기 접근 방법

처음에는 문제를 읽고 마치 depth가 2인 배열에 접근하듯이 strs[i][j] 이런식으로 이중 for loop를 사용해서 strs배열의 각 요소의 인덱스에 접근해서 (문자열은 유사배열이기 때문에 인덱스로 접근할 수 있다) 각각을 비교하고자 했다.
그러나 매개변수로 주어진 strs 배열의 길이를 알 수 없기 때문에 코드가 복잡해지고 비교가 불가하다는 결론을 내렸다.

나의 풀이

모든 테스트 케이스를 통과한 나의 코드 풀이는 다음과 같다.

const getPrefix = strs => {
 if(strs.length < 1) return "";
  
 let ans = "";
 const firstEl = strs[0];
  
for(let i in firstEl){
    if(strs.every(el => el.startsWith(firstEl[i]))){
      ans += firstEl[i];
      strs = strs.map(el => el.slice(1))
    }
 }
    return ans;
}

strs 배열의 첫번째 요소를 firstEl 변수에 할당하고, firstEl 변수의 길이만큼 반복을 돌리기 위해 for in 루프를 사용했다. index까지 동일한 '공통요소'를 찾아야하기 때문에 배열의 첫번째 요소를 가져와서 비교를 하면 된다고 생각했기 때문이다.

every 메소드는 첫번째 인자로 콜백함수를 받아서 배열의 '모든' 요소가 주어진 판별 함수를 통과하는지 테스트하여 Boolean 값을 반환한다.

그래서 나는 every함수안에 string.startsWith 메소드를 활용해서 각각의 요소가 같은 문자로 시작하는지 검사하였고, 만약 모든 요소가 테스트를 통과한다면 해당 문자를 빈 문자열에 집어넣고, 각각의 배열요소의 첫번째 문자열을 잘라내서 startsWith 함수를 사용한 내 로직이 계속 유효하게끔 만들었다.

번외 - Array.prototype.some()

every메소드와 상극(?)의 성질을 가지는 메소드로는 some이 있다. some 메소드는 배열의 요소 중 단 하나라도 판별함수를 통과한다면 true를 반환한다. 사용방법은 every 메소드와 동일하다.

참고 : MDN Web Docs

profile
니체의 마인드셋으로

0개의 댓글