수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.

1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...

1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한 조건

나의 풀이

function solution(answers) {
    /*
    1번 : 순서대로
    2번 : 2번먼저 1, 3, 4, 5
    3번 : 3 3이 먼저 그 다음에 11 22 44 55
    */
    let arr1 = [];
    let arr2 = [];
    let arr3 = [];
    
    // 1번 수포자
    for(let i=0; i<answers.length; i++) {
        arr1.push([1, 2, 3, 4, 5]);
    }
    
    // 2번 수포자
    for(let i=0; i<answers.length; i++) {
        arr2.push([2, 1, 2, 3, 2, 4, 2, 5]);
    }
    
    // 3번 수포자
    for(let i=0; i<answers.length; i++) {
        arr3.push([3, 3, 1, 1, 2, 2, 4, 4, 5, 5]);
    }
    
    let result1 = [];
    let result2 = [];
    let result3 = [];
    
    for(let i = 0; i < answers.length; i++) {
        if(arr1.flat(Infinity)[i] === answers[i]) {
            result1.push(answers[i]);  
        }
        
        if(arr2.flat(Infinity)[i] === answers[i]) {
            result2.push(answers[i]);  
        }
        
        if(arr3.flat(Infinity)[i] === answers[i]) {
            result3.push(answers[i]);  
        }
    }
    
    // 가장 긴거 뽑아내기
    let longest = Math.max(result1.length, result2.length, result3.length);
    let result = [];
    
    if(result1.length === longest) result.push(1);
    if(result2.length === longest) result.push(2);
    if(result3.length === longest) result.push(3);
    
    return result;
}

시간 복잡도를 고려한 풀이

function solution(answers) {
    /*
    1번 : 순서대로
    2번 : 2번먼저 1, 3, 4, 5
    3번 : 3 3이 먼저 그 다음에 11 22 44 55
    */
    
    // lookup table
    let arr1 = [1, 2, 3, 4, 5];
    let arr2 = [2, 1, 2, 3, 2, 4, 2, 5];
    let arr3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];
    
    // 5, 8, 10씩 끊어서
    let filteredArr1 = answers.filter((el, idx) => el === arr1[idx%5]).length;
    let filteredArr2 = answers.filter((el, idx) => el === arr2[idx%8]).length;
    let filteredArr3 = answers.filter((el, idx) => el === arr3[idx%10]).length;
    
    let result = [];
    let longest = Math.max(filteredArr1, filteredArr2, filteredArr3);
    
    if(longest === filteredArr1) result.push(1);
    if(longest === filteredArr2) result.push(2);
    if(longest === filteredArr3) result.push(3);
    
    return result;
}