[CodeTest] 프로그래머스 Lv1 - 모의고사

그냥·2022년 8월 22일
0

codetest

목록 보기
7/9

문제

모의고사



조건 정리

  1. 인자는 숫자로된 배열로 되어 있다.
  2. 반환값은 숫자로된 배열이어야 한다.
  3. 수포자 1,2,3은 찍는 방식이 반복된다.
  4. 수포자들의 찍는 방식과 인자값을 비교했을 때 가장 많이 맞춘 수포자를 배열에 넣어 반환한다.


내 풀이

function solution(answers){
  let answer = [];
  let first = [1, 2, 3, 4, 5];
  let second = [2, 1, 2, 3, 2, 4, 2, 5];
  let third = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];
  let f_cnt = 0;
  let s_cnt = 0;
  let t_cnt = 0;

  for (let i = 0; i < answers.length; i++){
    if (first[i % first.length] === answers[i]){
      f_cnt++;   
    }
    if (second[i % second.length] === answers[i]){
      s_cnt++;   
    }
    if (third[i % third.length] === answers[i]){
      t_cnt++;   
    }
  }

  let max_cnt = Math.max(f_cnt, s_cnt, t_cnt);

  if (max_cnt === f_cnt){answer.push(1)};
  if (max_cnt === s_cnt){answer.push(2)};
  if (max_cnt === t_cnt){answer.push(3)};

  return answer;
}

풀이 리뷰

  1. for문을 돌려 각 수포자의 반복되는 수의 배열의 index값과 answers.length를 나누어 수포자 배열의 값을 순환하여 answers의 원소값과 비교하였다.

  2. max_cnt는 세 수포자 중 가장 많이 맞은 갯수이다. max_cnt와 각각의 수포자의 맞은 갯수에 대해서 그 값이 같으면 answer에 1, 2, 3을 각각 push하였다.


문제점

  1. 선언하는 변수의 갯수가 너무 많다.
  2. for문 안에 세 개의 if문을 써야하기 때문에 효율성이 떨어진다.


다른 풀이

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;
}

array.filter()

array.filter()는 현재 배열에 대해서 특정 조건을 만족하는 새로운 배열을 만들고 싶을 때 사용한다.


정의

Array.prototype.filter ( callbackfn [ , thisArg ] )

filter를 사용하는 방법은 callbackfn을 통해 주어진 3개의 인자(요소 값, index, 순회하는 대상 객체)를 사용해 Boolean 값인 true 또는 false 값을 반환하는 함수를 등록한다.


const numbers = [1];

numbers.filter((number, index, source) => {

    // number: 요소값
    // index: source에서 요소의 index
    // source: 순회하는 대상

    console.log(number);
    // 1

    console.log(index);
    // 0

    console.log(source);
    // [1]

    return number > 3;
});


리뷰

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

(a,i)는 순서대로 (배열의 원소, 원소의 인덱스)이다. 이에 대해서 a(배열의 원소)가 a1[i%a1.length] 값과 같은 원소에 대해서 배열을 다시 만든다. 그리고 마지막으로 .length를 통해서 값이 같은 원소가 몇 개인지 반환한다. filter를 사용하였기 때문에 내가 사용하였던 불필요한 코드(변수 선언, for문)을 획기적으로 줄인 코드라고 할 수 있다.



출처

Array Filter 참고 블로그
https://7942yongdae.tistory.com/49

0개의 댓글