본문 바로가기
junior developer :)/알고리즘 & 코딩테스트

[프로그래머스]완전탐색_모의고사(Level 1/JS)

by ㅁ윤슬ㅁ 2023. 7. 13.
728x90
반응형

오늘은 완전탐색 방법으로 풀이한 문제를 적어보려고 한다.

완전탐색은 말 그대로 모든 경우의 수를 완전하게 탐색해서 정답을 찾아내는 알고리즘 방법이다.

모의고사
문제 설명
수포자는 수학을 포기한 사람의 준말입니다.
수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다.
수포자는 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 함수를 작성해주세요.

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

위 3개의 방식으로 답을 찍는 3명의 수포자중 누가 가장 높은 점수를 얻는지 알아내면 되는 문제다.
처음 문제를 봤을 때 참 흥미롭다는 생각이 들었다 학창시절이 생각나면서...ㅎㅎ

내가 처음 문제 풀이를 했던 방법은 아래와 같다.

function solution(answers) {
    var answer = [];
    let no1 = 0
    let no2 = 0
    let no3 = 0
    let one = Array(answers.length). fill([1,2,3,4,5]).flat();
    let two = Array(answers.length). fill([2,1,2,3,2,4,2,5]).flat();
    let three = Array(answers.length). fill([3,3,1,1,2,2,4,4,5,5]).flat();
    
    for(let i =0; i<answers.length; i++){
        if(one[i] === answers[i])
            no1++
        if(two[i] === answers[i])
            no2++
        if(three[i] === answers[i])
            no3++
    }
    
    let a = Math.max(no1,no2,no3)
    if(no1 === a)
        answer.push(1)
    if(no2 === a)
        answer.push(2)
    if(no3 === a)
        answer.push(3)
    
    return answer;
}

먼저 정답과 갯수가 같도록 세 수포자의 답이 적힌 배열을 만들어 준 뒤 정답 배열과 비교하는 방식을 사용했다.

확실히 하나하나 비교하는 방식이다 보니 시간이 많이 나오는 듯 하다.

다른 사람의 코드를 보다가 시간이 오래걸리는 이유를 찾았는데, 

    var a1 = [1, 2, 3, 4, 5];
    var a2 = [2, 1, 2, 3, 2, 4, 2, 5]
    var a3 = [ 3, 3, 1, 1, 2, 2, 4, 4, 5, 5];

    var a1c = answers.filter((a,i)=> a === a1[i%a1.length]).length;
    var a2c = answers.filter((a,i)=> a === a2[i%a2.length]).length;
    var a3c = answers.filter((a,i)=> a === a3[i%a3.length]).length;

배열을 answers.length만큼 채워줄게 아니라 한 사이클만 적어두고 나머지를 계산해 인덱스를 지정해주는 방법을 이용하면 필요없는 과정 몇개가 줄어드는 것을 확인할 수 있었다.

훨씬 적은 시간으로 문제를 해결할 수 있었다.

728x90
반응형