문제 개요
사람들의 소속 대륙 정보를 담고 있는 객체 배열을 입력받는 JavaScript 함수를 작성해야 합니다.
이 함수는 배열 안에 아프리카, 남아메리카, 북아메리카, 유럽, 아시아, 호주(오세아니아) 등 여섯 개 대륙이 모두 존재하면 true를 반환하고, 하나라도 빠져 있다면 false를 반환해야 합니다.
해결 접근 방식
가장 직관적인 방법은 다음과 같습니다.
1. 전체 대륙 목록을 담은 기준 배열을 만듭니다.
2. 입력받은 객체 배열에서 각 사람의 continent 값을 추출합니다.
3. 추출된 대륙이 기준 배열에 존재하면 해당 항목을 제거합니다.
4. 마지막에 기준 배열이 비어 있으면 모든 대륙이 포함된 것이므로 true를 반환합니다.
예제 코드
const people = [
{ firstName: 'Dinesh', lastName: 'A.', country: 'Algeria', continent: 'Africa', age: 25, language: 'JavaScript' },
{ firstName: 'Ishan', lastName: 'M.', country: 'Chile', continent: 'South America', age: 37, language: 'C' },
{ firstName: 'Rohit', lastName: 'X.', country: 'China', continent: 'Asia', age: 39, language: 'Ruby' },
{ firstName: 'Manpreet', lastName: 'P.', country: 'Andorra', continent: 'Europe', age: 55, language: 'Ruby' },
{ firstName: 'Rahul', lastName: 'Q.', country: 'Australia', continent: 'Australia', age: 65, language: 'PHP' },
];
const checkAllContinent = (arr = []) => {
const all = ['Africa', 'South America', 'North America', 'Europe', 'Asia', 'Australia'];
const listed = arr.map(obj => {
return obj.continent;
});
for (let i = 0; i < listed.length; i++) {
const cont = listed[i];
const ind = all.indexOf(cont);
if (ind !== -1) {
all.splice(ind, 1);
}
}
return all.length === 0;
};
console.log(checkAllContinent(people));실행 결과
false
위 데이터에는 북아메리카(North America)에 속한 사람이 없기 때문에 결과는 false가 됩니다.
더 간결한 대안: every와 some 활용하기
배열을 직접 수정하는 방식 대신, every와 some 메서드를 조합하면 훨씬 선언적이고 읽기 쉬운 코드를 작성할 수 있습니다.
const checkAllContinent = (arr = []) => {
const all = ['Africa', 'South America', 'North America', 'Europe', 'Asia', 'Australia'];
return all.every(cont => arr.some(obj => obj.continent === cont));
};이 방식은 원본 배열을 변경하지 않으므로 부작용(side effect)이 없으며, 의도도 한눈에 파악할 수 있습니다. 성능 면에서는 O(n × m)의 시간 복잡도를 가지지만, 대륙 목록이 최대 6개뿐이므로 실질적인 차이는 미미합니다.