문제 설명
두 배열이 얼마나 유사한지 확인해보려고 합니다. 문자열 배열 s1과 s2가 주어질 때 같은 원소의 개수를 return하도록 solution 함수를 완성해주세요.
제한사항
1 ≤ s1, s2의 길이 ≤ 100
1 ≤ s1, s2의 원소의 길이 ≤ 10
s1과 s2의 원소는 알파벳 소문자로만 이루어져 있습니다
s1과 s2는 각각 중복된 원소를 갖지 않습니다.
구글검색으로 JavaScript의 배열비교를 검색하여 공부했다. 쉬운 문제인거 처럼 보였지만 배열의 길이가 서로 다르다는게 어렵게 다가왔다. 일단 두 배열을 비교해서 같은 교집합을 반환하고 그 교집합의 값을 length로 표현하고싶었다.
교집합(Intersection)
const arr1 = ['1','2','3','4','5']; const arr2 = ['1','2']; let intersection = arr1.filter(x => arr2.includes(x)) return intersection // [1,2]가 나온다 return intersection.length // 2 가 나온다
function solution(s1, s2) { const a = s1.filter(x => s2.includes(x)) return a.length }
주어진 코드는 filter 메서드와 includes 메서드를 사용하여 두 배열에서 같은 원소를 찾고, 그 개수를 반환하는 방식입니다.
s1.filter(x => s2.includes(x)): filter 메서드를 사용하여 s1 배열의 각 원소 x에 대해 s2 배열에 포함되는지 확인합니다. includes 메서드를 사용하여 s2 배열에서 x를 찾습니다. 조건을 만족하는 원소들로 새로운 배열 a를 생성합니다.
a.length: 새로운 배열 a의 길이를 반환합니다. 이는 s1과 s2에서 같은 원소의 개수를 의미합니다.
주어진 코드는 원본 배열의 길이가 다른 경우에도 작동합니다. filter 메서드는 s1 배열의 각 원소를 순회하며 조건을 만족하는 원소들로 새로운 배열을 생성하기 때문입니다. includes 메서드를 사용하여 s2 배열에서 해당 원소를 찾는 것으로 중복된 원소를 처리할 수 있습니다.
x는 s1 배열의 각 원소를 나타내는 변수입니다. filter 메서드의 콜백 함수에서 파라미터로 전달되는 값이기 때문에 이름을 자유롭게 정할 수 있습니다.
filter 메서드는 콜백 함수를 배열의 각 원소에 대해 실행하고, 콜백 함수의 반환값이 true인 원소들로 새로운 배열을 생성합니다. 따라서 s1 배열의 각 원소를 x로 받아서 콜백 함수 내부에서 처리하고 있습니다. x는 각 원소를 의미하는 임시 변수로 사용됩니다.
const s1 = [1, 2, 3, 4, 5]; const s2 = [3, 4, 5, 6, 7];
이 경우, filter 메서드는 s1 배열의 각 원소 x에 대해 s2 배열에 포함되는지 확인합니다. 즉, s1 배열의 원소를 하나씩 순회하면서 s2 배열에 해당 원소가 존재하는지 확인하는 과정을 거칩니다.
x = 1:
s2.includes(x)는 s2 배열에 1이 포함되어 있는지 확인합니다. 결과는 false입니다.
x = 2:
s2.includes(x)는 s2 배열에 2가 포함되어 있는지 확인합니다. 결과는 false입니다.
x = 3:
s2.includes(x)는 s2 배열에 3이 포함되어 있는지 확인합니다. 결과는 true입니다.
x = 4:
s2.includes(x)는 s2 배열에 4가 포함되어 있는지 확인합니다. 결과는 true입니다.
x = 5:
s2.includes(x)는 s2 배열에 5가 포함되어 있는지 확인합니다. 결과는 true입니다.
따라서 filter 메서드를 통해 생성된 새로운 배열 a는 [3, 4, 5]가 됩니다. 이후 a.length를 호출하여 배열의 길이를 반환하므로, 최종적으로 3을 반환하게 됩니다. 이는 s1과 s2에서 같은 원소의 개수를 의미합니다.