오늘 뭐했냐/기억하면 좋을 문제들

배열의 유사도 - .filter() / .includes() 활용 복습 및 Set형 활용

스스로에게 2023. 5. 30. 17:56

두 배열이 얼마나 유사한지 확인해보려고 합니다. 문자열 배열 s1과 s2가 주어질 때 같은 원소의 개수를 return하도록 solution 함수를 완성해주세요.

 

function solution(s1, s2) {
    let answer = s1.filter(t => s2.includes(t))
    return answer.length;
}

전에 풀었던 문제에서 다른 사람의 풀이를 인상 깊게 본 적이 있어서 쉽게 풀었다 

이를 한 번 더 기억하기 위해 가져왔다 .filter()의 콜백함수로 .includes()를 주어

s1과 s2의 같은 요소들만 모은 배열을 만든 다음 그 길이를 반환한다

 

아직은 어색한 Set를 활용한 방법도 있다 

Set는 유일한 값들만 모은 형태 즉 겹치는 값이 없다는 것을 이용해 

function solution(s1, s2) {
  const concat = [...s1, ...s2];
  // 스프레드 문법으로 두 배열을 하나로 합친다
  const setConcat = Array.from(new Set(concat));
  // 합친 배열을 Set로 공통된 요소들이 한 번씩만 들어가게 한다 
  // 이를 다시 배열로 바꿔준다
  return concat.length - setConcat.length;
  // 겹치는 요소가 두 번씩 들어간 배열의 길이를  
  // 겹치는 요소가 한 번씩만 들어간 배열의 길이로 빼서 
  // 겹치는 요소의 길이를 구한다 
}

이렇게 푸는 방법도 있었다

 

for문을 중첩해서 두 값을 돌아가며 비교하고 값이 같다면 카운터를 추가해주는 방법도 있다

하지만 위에 두 방법이 가장 효율적이고 오히려 보기가 쉬운 것 같아 여기에서 다루진 않았다