배열의 첫 번째 요소에 담긴 문자열이, 두 번째 요소의 문자열에 포함된 모든 글자를 가지고 있는지 판별하여 true 또는 false를 반환하는 함수를 작성해 보겠습니다.
문제 이해하기
먼저 몇 가지 예시를 통해 동작 방식을 살펴보겠습니다.
["hello", "Hello"]는 true를 반환해야 합니다. 대소문자 구분 없이 두 번째 문자열의 모든 글자가 첫 번째 문자열 안에 존재하기 때문입니다.
["hello", "hey"]는 false를 반환해야 합니다. "hello"에는 "y"라는 글자가 없기 때문입니다.
["Alien", "line"]은 true를 반환해야 합니다. "line"을 이루는 모든 글자(l, i, n, e)가 "Alien" 안에 모두 들어 있기 때문입니다.
해결 접근 방식
생각보다 간단한 문제입니다. 두 번째 요소의 문자열을 한 글자씩 분리(split)한 뒤, 생성된 배열을 순회하면서 각 글자가 첫 번째 문자열에 포함되어 있는지만 확인하면 됩니다.
여기서 every() 메서드를 활용하면 코드를 매우 깔끔하게 작성할 수 있습니다. every()는 배열의 모든 요소가 주어진 조건을 만족할 때만 true를 반환하기 때문에, 이 문제의 요구 사항과 정확히 일치합니다. 또한 대소문자 무시 조건을 처리하기 위해 비교 전에 toLowerCase()로 두 문자열을 소문자로 통일해 줍니다.
구현 예시
const arrayContains = ([first, second]) => {
return second
.toLowerCase()
.split("")
.every(char => {
return first.toLowerCase().includes(char);
});
};
console.log(arrayContains(['hello', 'HELLO']));
console.log(arrayContains(['hello', 'hey']));
console.log(arrayContains(['Alien', 'line']));코드 설명
- 구조 분해 할당: 매개변수
[first, second]를 통해 배열의 첫 번째와 두 번째 요소를 바로 추출합니다. - toLowerCase(): 대소문자 차이를 무시하고 비교하기 위해 양쪽 문자열을 모두 소문자로 변환합니다.
- split(""): 두 번째 문자열을 개별 글자 배열로 분리합니다.
- every() + includes(): 각 글자가 첫 번째 문자열에 하나라도 없으면 즉시 false를 반환하고, 모두 존재하면 true를 반환합니다.
실행 결과
콘솔 출력 결과는 다음과 같습니다.
true false true
첫 번째 호출은 대소문자만 다른 동일한 단어이므로 true, 두 번째는 'y'가 없어 false, 세 번째는 필요한 글자가 모두 존재하므로 true가 출력됩니다. 이처럼 every()와 includes()를 조합하면 반복문 없이도 간결하고 가독성 높게 문자 포함 여부를 검사할 수 있습니다.