모의고사 TIL

Guk's.velog·2024년 5월 29일
0

코딩테스트

목록 보기
8/22

문제

오늘의 문제는 임의의 배열 3개를 주고, answers 배열과 비교하여 가장 많이 일치하는 순서대로 answer를 반환하는 것이다.

제한 조건
시험은 최대 10,000 문제로 구성되어있습니다.
문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.

풀이

먼저 접근한 방법은 다음과 같다.
1. 각 배열의 패턴을 찾는다.
2. 일치하는 값들을 비교하는 방법을 찾는다.
3. 조건에 만족하는 결과를 return하는 방법을 찾는다.

function solution(answers) {
    var answer = [];
    
    //1.각 배열의 패턴
    var arr1 = [1,2,3,4,5]
    var arr2 = [2,1,2,3,2,4,2,5]
    var arr3 = [3,3,1,1,2,2,4,4,5,5]

    var a = 0, b = 0, c = 0;
    
    //2.일치하는 값 비교 카운트
    for(var i = 0 ; i < answers.length ; ++i){
        if(answers[i] == arr1[i % arr1.length]){
            a += 1
        }
        if(answers[i] == arr2[i % arr2.length]){
            b += 1
        }
        if(answers[i] == arr3[i % arr3.length]){
            c += 1
        }
    }
    
    //결과에 만족하는 수 오름차순 정렬
    let max = Math.max(a,b,c)
    
    if(a == max) answer.push(1)
    if(b == max) answer.push(2)
    if(c == max) answer.push(3)
    
    return answer;
}

리팩토링

메모리를 좀 낭비한것 같아서 리팩토링의 과정을 거쳤다.

function solution(answers) {
    var answer = [];
   
    //각 배열의 패턴과 일치하는 값 비교 카운트
    var a = answers.filter((v,i) => v == [1,2,3,4,5][i%5]).length
    var b = answers.filter((v,i) => v == [2,1,2,3,2,4,2,5][i%8]).length
    var c = answers.filter((v,i) => v == [3,3,1,1,2,2,4,4,5,5][i%10]).length
    
    let max = Math.max(a,b,c)
    
    //결과에 만족하는 수 오름차순 정렬
    if(a == max) answer.push(1)
    if(b == max) answer.push(2)
    if(c == max) answer.push(3)
    
    return answer;
}

그 결과, 속도가 향상된 부분을 확인했다.
이전 코드 테스트14 -> 3.31ms
리팩토링 코드 테스트14 -> 2.31ms

0개의 댓글