프로그래머스 코딩테스트 '모의고사'

function solution(answers) {
    let answer = [];
    let students = [[1, 2, 3, 4, 5], [2, 1, 2, 3, 2, 4, 2, 5], [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]];
    let tmpArr = [];

    
    for (let i=0; i<students.length; i++) {
        let cnt=0;
        let n=0;
        
        for (let j=0; j<answers.length; j++) {
            if (students[i].length === n) n=0;
            if (answers[j] === students[i][n]) cnt++;
            n++;
        }
        
        if (tmpArr.length === 0) tmpArr.push([i+1, cnt]);
        else if (tmpArr[tmpArr.length-1][1] < cnt) {
            tmpArr=[];
            tmpArr.push([i+1, cnt]);
        } else if (tmpArr[tmpArr.length-1][1] === cnt) tmpArr.push([i+1, cnt]);
    }
    
    if (tmpArr.length === 1) answer.push(tmpArr[0][0]);
    else {
        for (let i=0; i<tmpArr.length; i++) {
            answer.push(tmpArr[i][0]);   
        }
    }
    
    answer.sort((a, b) => {return a - b} );
    
    return answer;
}

풀이과정

  1. 우선은 학생들이 문제를 찍는 패턴을 배열화하고, 이걸 어떻게 answers[i]이랑 학생1 정답[i] for문이 돌아가게 만들고, 그 이후 학생 2번, 학생 3번으로 넘어가게 만들까에 대해서 고민을 했다. 근데 학생 정답배열 길이가 다 다른데?..
  2. 2차원 배열은 인덱스별로 길이가 달라도 괜찮단다. 그래서 students라는 배열에 학생들의 정답패턴을 집어넣었다. 그리고 answers(문제수)는 최대 10,000개까지인데 학생 정답배열 길이는 한정되어있음... 그래서 answers와 같은 인덱스로 증가하게 냅두면 안됨. n이라는 변수를 새로 선언해서 for문 끝날때마다 증가하게 두고, 만약 n이 정답배열길이와 같아지면 0으로 초기화시키는 if문을 선언했다.
  3. tmpArr에 tmpArr길이가 0이면 무조건 [i+1(학생번호), cnt(정답수)] push, tmpArr의 마지막 인덱스의 정답수가 cnt보다 작으면 tmpArr배열 초기화하고 push, tmpArr의 마지막 인덱스의 정답수가 cnt와 같으면 push한다.
  4. tmpArr의 길이가 1이면 tmpArr[0][0]를 answer에 push, 1이상이면 for문 돌려서 [i][0]만 push.
  5. 그리고 sort해서 오름차순.
  6. ...근데 진짜 이렇게 장황하게 코드를 썼어야 되는게 맞...을까?

다른사람 풀이

  1. Math.max는 나도 쓸 생각은 했었는데 같은 값일 경우에는 하나밖에 안 나와서 포기했다. 근데 Math.max.apply(null, 변수(또는 함수))라는 걸 꽤나 많이 쓰는 편이었다.
    *Math.max.apply는 두번째 매개변수 자리에 배열을 받는다. (첫번째 자리에는 아무거나 넣어도 상관없다는 듯 하다.)
  2. map, filter, forEach, 그리고 object를 쓰는 사람이 많이 있다. ...아직 난 잘 못쓰는 편이라 부끄럽다ㅠ 내장함수를 쓰니 확실히 코드가 짧아진다는 걸 느꼈다.
  3. '좋아요'수가 제일 많은 풀이는
  • 학생 정답을 '학생1'변수에 1차원배열로 선언.
  • answers.filter((a, i)=> a === 학생1[i%학생1.length]).length;
    이런 형식으로 각각 값을 '학생1c'변수에 담고, Math.max를 사용해서 나온 결과값을 max변수에 담음.
  • if문으로 '학생1c'변수와 max가 같으면 answer에 push해넣는 식으로 선언.
    ...이렇게 간단히 풀 수 있구나!

좋은 웹페이지 즐겨찾기