codingTest

프로그래머스-모의고사 완전탐색 풀이

에밀오구 2023. 4. 26. 17:47

프로그래머스 문제: 모의고사 

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

나의 풀이 설명과 피드백

function solution(answers) {
//수포자1, 2, 3의 찍는 규칙  
    let arr1 =[1,2,3,4,5];       // 변수명 man1이 더 명시적
    let arr2 =[2,1,2,3,2,4,2,5];
    let arr3 =[3,3,1,1,2,2,4,4,5,5];
    
//수포자1, 2, 3의 규칙으로 마지막 문제까지 찍은 답안 
    function makeAnswerSheet (arr){
         let newarr =[]; 
        for(let i = 0 ; i<answers.length; i++ ){
            if(i >=arr.length){  //굳이 If 문으로 작성하지 않아도 i % man1.length 로 정상작동
                 let num = i % arr.length;
                newarr.push(arr[num]);
            }else{
                newarr.push(arr[i]);
            }
        }
        return newarr;
    }
    
    let newarr =makeAnswerSheet(arr1);  //수포자1이 마지막문제까지 찍은 답안 
     let newarr2 =makeAnswerSheet(arr2); 
     let newarr3 =makeAnswerSheet(arr3); 
     
  //수포자들이 맞은 갯수 넣기위한 초기화
  //예정: 인덱스 1의 값= 수포자1이 맞춘 갯수,   인덱스 2의 값= 수포자2이 맞춘 갯수
  let answer= [0,0,0,0]; 

    for(let j =0;j<answers.length;j ++){
    
        //답안의 번호와 수포자1이 찍은 번호가 같다면 
        if(answers[j]===newarr[j]){
           //answer의 인덱스 1 에 +1 추가 
           answer[1] = answer[1]+ 1;    // answer[1]++; 이 더 클린
        }
        if(answers[j]===newarr2[j]){
            answer[2] =answer[2]+ 1;
        }
        if(answers[j]===newarr3[j]){
            answer[3]=answer[3]+1;
        }   
    }
  //수포자들 중에서 가장 많이 맞춘 사람의 갯수 구하기 
    let whois =  Math.max(...answer);
    
    let result =[];
  //가장 많이 맞춘 사람의 갯수와 값이 같다면 result배열에 push 
  //중복일경우 오름차순 해야함으로 인덱스가 낮은 순부터 push 
  answer.forEach((el,idx)=>{
      if(el===whois){
          result.push(idx);
      }
  });
  
    return result;
    
    
}

다른 이의 풀이 1

function solution(answers) {
    var answer = [];
    const man1 = [1, 2, 3, 4, 5];
    const man2 = [2, 1, 2, 3, 2, 4, 2, 5];
    const man3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];
    let count = [0, 0, 0];

    for(let i = 0; i < answers.length; i++) {
        if(answers[i] == man1[i % man1.length]) count[0]++;
        if(answers[i] == man2[i % man2.length]) count[1]++;
        if(answers[i] == man3[i % man3.length]) count[2]++;
    }

    const max = Math.max(count[0], count[1], count[2]);
    for(let i = 0; i < count.length; i++) {
        if(max == count[i]) answer.push(i + 1);
    }

    return answer;
}

다른 이의 풀이 2

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

배운점

  •  선언한 변수는 코드 최상단에 작성한 부분
  • i%a1.length 에서 어차피 작은 수 % 큰수 경우에도 제대로 작동함으로 if문 쓸 필요가 없이 바로 작성할 수 있다는 점. 
    ex) 3%5=3 
  • 알맞게 고른 번호들을 담은 배열의 길이가 곧 수포자가 맞춘 갯수라는 점. 
  • 화살표함수를 사용해서 가독성을 높인 부분.

-> 다른 이 풀이2. 댓글 중 filter를 세 번 돌린다는 점에서 반복문 하나 안에서 처리하는 것 보다 많이 안 좋은 방식이라는 의견이 있었다.