Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript에서 두 배열을 비교해 공통 요소 개수를 확인하고 백분율 계산하기

문제 상황

두 개의 배열이 있다고 가정해 보겠습니다. 하나는 특정 문제들의 정답 문자열을 담고 있고, 다른 하나는 응시자가 제출한 답변들을 담고 있습니다. 그런데 어떤 이유로 인해 배열의 순서가 뒤섞여서 정답과 답변이 서로 대응되지 않는 상황입니다. 다만, 어떤 두 문제도 같은 답을 가진 적은 없다는 점은 확실합니다.

따라서 우리의 과제는 다음과 같습니다. 두 배열을 인자로 받아 공통 요소를 검사하고, 두 배열 사이의 모든 공통 요소를 찾아낸 뒤, 일치하는 답변의 개수를 바탕으로 응시자의 득점 백분율을 계산하는 함수를 작성하는 것입니다.

코드 구현

배열의 reduce() 메서드와 includes() 메서드를 활용하면 간단하게 해결할 수 있습니다. reduce()로 정답 배열을 순회하면서 각 요소가 응시자 답변 배열에 포함되어 있는지 확인하고, 포함되어 있다면 카운트를 증가시킵니다.

const correct = ['India', 'Japan', 56, 'Mount Everest', 'Nile', 'Neil Armstrong', 'Inception', 'Lionel Messi', 'Joe Biden', 'Vatican City'];
const answered = ['Nile', 'Neil Armstrong', 'Joe Biden', 'Mount Everest', 'Vatican City', 'Inception', 'Japan', 56, 'China', 'Cristiano Ronaldo'];
const findPercentage = (first, second) => {
    const count = first.reduce((acc, val) => {
        if(second.includes(val)){
            return ++acc;
        };
        return acc;
    }, 0);
    return (count / first.length) * 100;
};
console.log(`Candidate have scored ${findPercentage(correct, answered)}%`);

동작 원리

findPercentage 함수는 먼저 correct 배열(정답 배열)을 reduce()로 순회합니다. 각 순회 단계에서 현재 정답 값 valanswered 배열에 존재하는지 includes()로 검사하고, 존재할 경우 누적 카운터 acc를 1씩 증가시킵니다. 순회가 끝나면 일치한 답변의 총 개수가 반환됩니다.

이후 이 개수를 전체 문항 수인 first.length로 나누고 100을 곱해 백분율을 계산합니다. 위 예제에서는 10문항 중 8개가 일치했으므로 80%라는 결과가 나옵니다.

출력 결과

콘솔에 출력되는 결과는 다음과 같습니다.

Candidate have scored 80%