본문 바로가기
코딩 테스트/[JS] programmers 코딩 테스트 연습

[Programmers/JS] 모의고사 / 프로그래머스 코딩 테스트 연습

by M개발자 2021. 6. 20.
반응형

모의고사

filter랑 친해지기 d-^0^-b


문제 설명

 

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


예시

 

answer return
[1, 2, 3, 4, 5] [1]
[1, 3, 2, 4, 2] [1, 2, 3]

코드 해석 및 전체 코드

 

알고리즘

1.stu = 학생들이 찍은 번호를 배열에 담는다. 

2. cnt = 맞은 개수를 담을 배열을 선언한다. 

3. filter 이용하여 맞은 개수를 구한다.

4. cnt 중 최댓값을 구한다. 

5. 최댓값과 맞은 개수가 같을 경우 answer 배열에 학생 번호를 담는다. 

 

 

filter(ele, index, array), thisArg)

ele → 배열의 요소 값

index → 요소의 인덱스

array → 사용되는 배열 객체

thisAray → filter에 사용될 this값

 

3. filter 이용하여 맞은 개수를 구한다.

answer → 정답이 담긴 배열

cnt → answer 배열의 요소 값 

i → 요소의 인덱스

cnt === stuN[i % stuN.length]) → cnt와 i를 sntN 배열에서 stuN.length를 나눈 인덱스와 같은 경우만 반환

 

cnt.push(answers.filter((cnt, i) => cnt === stu1[i % stu1.length]).length);

cnt stu1[i % stu1.length] true / false
1 0 % 5 = 0
stu[0] = 1
1 === 1 
true
2 1 % 5 = 1
stu[1] = 2
2 === 2
true
3 2 % 5 = 2
stu[2] = 3
3 === 3
true
4 3 % 5 = 3
stu[3] = 4
4 === 4
true
5 4 % 5 = 4
stu[4] = 5
5 === 5
true

 

4. cnt 중 최댓값을 구한다. 

예시 1 경우 cnt는 [ 5, 0, 0 ]이다.

따라서 최댓값은 5이다.

 

5. 최댓값과 맞은 개수가 같을 경우 answer 배열에 학생 번호를 담는다. 

max와 cnt[i]가 같을 경우 answer 배열에 i + 1을 배열 마지막에 추가한다. 

 

function solution(answers) {
    var answer = [];
    
    //찍은 번호 배열에 담기
    let stu1 = [1, 2, 3, 4, 5];
    let stu2 = [2, 1, 2, 3, 2, 4, 2, 5];
    let stu3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];

	//맞은 개수 배열에 담기
    let cnt = [];
    cnt.push(answers.filter((cnt, i) => cnt === stu1[i % stu1.length]).length);
    cnt.push(answers.filter((cnt, i) => cnt === stu2[i % stu2.length]).length);
    cnt.push(answers.filter((cnt, i) => cnt === stu3[i % stu3.length]).length);

	//최댓값 구하기
    let max = Math.max(...cnt);

	//모두 맞은 개수가 없을 경우 다 꼴찌이므로 빈 배열 반환
    if (max === 0) return [];

	//최댓값과 맞은 개수가 같을 경우 answer 배열에 push
    for (let i = 0; i < cnt.length; i++) {
        if (max === cnt[i]) answer.push(i + 1);
    }

    return answer;
}

github

programmers

반응형

댓글