IT/Algorithm

프로그래머스) 모의고사

프티 2021. 7. 1. 17:00
반응형

https://programmers.co.kr/learn/courses/30/lessons/42840#

 

코딩테스트 연습 - 모의고사

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

programmers.co.kr

 

풀이

a부터 c까지 각각 1번부터 3번 학생의 찍기 패턴을 정의하였고,

그리고 모두 같은 점수를 받을 경우를 고려하여 1~3의 key를 초기값 0으로 정의하여 loser 오브젝트를 정의했다.

 

문제는 최대 10,000개일 수 있으므로 answers의 길이만큼 반복한다.

1~3번 학생들은 각자의 패턴이 다르므로 각각 j, k, l로 반복된다.

각각의 패턴에 정답을 대조하여 같으면 1~3번 key의 value로 카운트를 세도록 하였다.

 

과정이 끝나면 배열 answer에 각 카운트를 집어넣고,

Object.keys()를 활용하여 오브젝트에 존재하는 keys들을 배열로 불러온다.

체이닝으로 filter()를 활용하여 key의 value가 answer의 최댓값에 해당하는 key들만 필터링한다.

 

마지막으로 문자열 형식으로 저장된 key를 parseInt()를 활용하여 정수로 바꿔준 후 반환한다.

function solution(answers) {
    var answer = [];
    var loser = {a:[1,2,3,4,5],b:[2,1,2,3,2,4,2,5],c:[3,3,1,1,2,2,4,4,5,5],1:0,2:0,3:0};
    
    for(let i=0,j=0,k=0,l=0; i<answers.length; i++,j++,k++,l++){
        
        j > 4 ? j=0 : j=j;
        k > 7 ? k=0 : k=k;
        l > 9 ? l=0 : l=l;
        
        answers[i] === loser['a'][j] ? loser[1]+= 1 : loser[1] += 0;
        answers[i] === loser['b'][k] ? loser[2] += 1 : loser[2] += 0;
        answers[i] === loser['c'][l] ? loser[3] += 1 : loser[3] += 0;
    }
    
    answer.push(loser[1],loser[2],loser[3]);
    
    return Object.keys(loser).filter(key=>loser[key] === Math.max.apply(null,answer)).map(num=>parseInt(num));
}

 

다른 사람 풀이

function solution(answers) {
    var 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;
    var max = Math.max(a1c,a2c,a3c);

    if (a1c === max) {answer.push(1)};
    if (a2c === max) {answer.push(2)};
    if (a3c === max) {answer.push(3)};


    return answer;
}

패턴 할당은 같다.

하지만 점수를 세는 과정이 다른데 나에 비하면 매우 깔끔하신 것 같다ㅠ

 

먼저 a1c~a3c는 1번~3번 학생의 점수 카운트인데,

filter 메소드로 주어진 정답지 answers의 a, i를 변수로 설정하였다.

여기서 a는 정답, i는 인덱스이다.

 

이어서 a === a1[i%a1.length] 구간을 대표로 보면 나는 삼항 연산자로 패턴을 유지하고 있는 데 비해,

이 분은 각 패턴 배열의 길이로 나눈 나머지 값을 사용하여 더 깔끔하게 코드를 작성하셨다.

그렇게 같은 정답만을 필터링한 배열을 a1c~a3c에 각각 저장하고,

이들의 최댓값을 max로 정의하였다.

 

마지막으로 나는 오브젝트를 활용하여 중복 최고 점수일 때의 인덱스 문제를 해결했지만,

그냥 if문으로 각각 1~3을 배열에 할당하였다.

 

내가 배열에 대한 메소드를 활용할 때 인덱스를 활용하지 않는 것을 알았다.

한 가지의 변수만 허용되는 것처럼 나도 모르게 늘 변수를 정할 때 하나만 생각한다.

 

다음부터는 메소드를 사용할 때마다 의식적으로 떠올리려고 노력해야겠다.

반응형