1일 1코테 day 23 _ 모의고사

konut ko·2022년 9월 5일
0
post-custom-banner

문제

나의 풀이 1 -fail

나름 머리싸매서 했는데 태스트케이스에서 6개나 걸린다....

function solution(answers) {
let countA =0
let countB =0
let countC =0
let a = [1,2,3,4,5]
 for(i=0;i<Math.ceil(answers.length/5);i++){
     for(j=0; j<5; j++){
     if(answers[5*i+j] === a[j]){countA += 1}         
     }
 }
 
let b = [2,1,2,3,2,4,2,5]
 for(k=0;k<Math.ceil(answers.length/8);k++){
     for(l=0; l<8; l++){
     if(answers[8*k+l] === b[l]){countB += 1}         
     }
 }
    
 let c = [3,3,1,1,2,2,4,4,5,5]
 for(m=0;m<Math.ceil(answers.length/10);m++){
     for(n=0; n<10; n++){
     if(answers[10*m+n] === c[n]){countC += 1}         
     }
 }

let arr1 = [countA,countB,countC]
let arr2 = [countA,countB,countC].sort((e,f)=>f-e)
if( arr2[0]>arr2[1]){ return [arr1.indexOf(arr2[0]) +1] }
    else if (arr2[0]=arr2[1]>arr2[2] ) {return [arr1.indexOf(arr2[0])+1, arr1.indexOf(arr2[1]) +1].sort((c,d)=>c-d)}
    else {return [1,2,3] }


}

나의 풀이 2 - success!

마지막에 최대값 뽑아내는 풀이가 더럽게 맘에 안들지만 그래도
풀었으니까!

function solution(answers) {

    let a = [1,2,3,4,5]
    let b = [2,1,2,3,2,4,2,5]
    let c = [3,3,1,1,2,2,4,4,5,5]
   
   
   // 정답 개수 구하는 함수
function abc (answers,arrays) {let sol = 0
    for(m=0;m<Math.ceil(answers.length/(arrays.length));m++){
        for(n=0; n<(arrays.length); n++){
                if(answers[(arrays.length)*m+n] === arrays[n]){sol += 1}         
            }
        }
    return sol}    


// 정답 최대값 찾는 코드
let arr = [abc(answers,a),abc(answers,b),abc(answers,c)]
 if(arr[0] == arr[1]){ 
    if(arr[1] == arr[2]) { return [1,2,3]}
    else if(arr[1] > arr[2]){return [1,2]}
    else{return [3]}}
else if (arr[0] > arr[1]){
    if(arr[0]== arr[2]){return [1,3]}
    else if(arr[0]>arr[2]){return [1]}
    else{return [3]}}
else if(arr[0]<arr[1]){
    if(arr[1] == arr[2]){return [2,3]}
    else if (arr[1]>arr[2]){return [2]}
    else{return [3]}
}
}

그래도 저 9가지나 되는 if 경우의 수가 진짜 너무 마음에 안든다


(점수보고 셀프 힐링...)

다른 정답자들 코드리뷰하고
배열에서 최대값일 때 인덱스 뽑는 다른 풀이 고안하자




넘의 풀이 1

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

.filter((n, i, s) => { @#!코드들~});
n: 요소값 / i: 인덱스 / s: 순회하는 대상

다른 블로그 보니까 함수사용이 헷갈리면 함수안에 콘솔 찍어서 확인하더라! 나도 그렇게 하자!
예를 들면 위의 .filter 함수 안에다가

let num  = [1];

num.filter((n, i, source) => {

    console.log(n);		// 1
    console.log(i);		// 0
    console.log(s);		// [1]

    return n > 0;
});

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

정답 배열은 각 수포자 배열의 길이 만큼 순환하며 채점하면 된다.

나는 인덱스를 for문으로 돌렸는데 이 분은 a1[i%a1.length] 이렇게 처리하심. 개천재..... 나머지는 0부터 자기자신-1까지 므로 수포자 배열의 길이a1.length 만큼 계속 반복해서 순환가능함.
a === a1[i%a1.length]이렇게 채점해서 filter를 통과하는 수(맞은 문제 수)를 배열로 담고 그걸 .length로 반환함.

신기하면서도 중요한건 filter가 원본배열 훼손하지 않기 때문에

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;

이렇게 쓰는게 가능함.

내가 무식하게 if문 9 줄 돌린 구간도 기가 막히게 푸셨는데,

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

셋 중 최대값을 뽑은 후에 그 최대값과 같은 요소가 있으면 순서대로 1,2,3을 넣었다.

아!!!!! 이런 방법이!!!




넘의 풀이 2

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

채점 부분은 윗분과 비슷한 원리로 if문으로 하셨고

가장 많이 맞춘사람 뽑는 부분도 비슷한 원리인데 if문으로 더 깔끔해졌다.

내 코드가 길어진 이유가 max를 안뽑아서 구나.. index+1을 하면 된다는 아이디어까지는 진행했는데 최대값을 따로 안뽑고 배열에서 삭제시키니까 인덱스가 꼬여버림.

max값을 기준으로하면 1,2,3번 수포자 순으로 들어있는 배열에서 같은 max값의 index에+1하면 간단해짐.

결론 ?!

이 문제는 보름 후에 다시 한번 더 풀어봐야겠다.

profile
보초딩코라 틀린 내용 있을 수도 있습니다. 댓글 지적 환영
post-custom-banner

0개의 댓글