나름 머리싸매서 했는데 태스트케이스에서 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] }
}
마지막에 최대값 뽑아내는 풀이가 더럽게 맘에 안들지만 그래도
풀었으니까!
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 경우의 수가 진짜 너무 마음에 안든다
(점수보고 셀프 힐링...)
다른 정답자들 코드리뷰하고
배열에서 최대값일 때 인덱스 뽑는 다른 풀이 고안하자
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을 넣었다.
아!!!!! 이런 방법이!!!
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하면 간단해짐.
이 문제는 보름 후에 다시 한번 더 풀어봐야겠다.