오늘의 알고리즘 👍
📝 1. 모의고사
- 수포자는 수학을 포기한 사람의 준말입니다.
- 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다.
- 수포자는 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 함수를 작성해주세요.
▷ 입출력 예
solution([1,2,3,4,5])
solution([1,3,2,4,2])
▷ 내 풀이
▷ 해결못함 ❌
function solution(answers) {
const answer = [];
let count1 = 0;
let count2 = 0;
let count3 = 0;
const arr1 = [1, 2, 3, 4, 5];
const arr2 = [2, 1, 2, 3, 2, 4, 2, 5];
const arr3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];
for (let i = 0; i < answers.length; i++) {
answers[i] === arr1[i % 5] ? count1++ : 0;
answers[i] === arr2[i % 8] ? count2++ : 0;
answers[i] === arr3[i % 10] ? count3++ : 0;
}
console.log(count1);
console.log(count2);
console.log(count3);
if (count1 === count2 && count3) {
answer.push(1, 2, 3);
} else if ((count1 !== count2) !== count3) {
answer.push(count1 > count2 ? 1 : 2) > count3 ? (count1 > count2 ? 1 : 2) : count3;
} else if (count1 === count2) {
answer.push(1, 2);
} else if (count2 === count3) {
answer.push(2, 3);
} else if (count1 === count3) {
answer.push(1, 3);
}
return answer;
}
▷ 수업 풀이
const answerTable = [
[1, 2, 3, 4, 5],
[2, 1, 2, 3, 2, 4, 2, 5],
[3, 3, 1, 1, 2, 2, 4, 4, 5, 5],
];
function solution(answers) {
const score = [0, 0, 0];
for (let i = 0; i < answers.length; i++) {
for (let j = 0; j < answerTable.length; j++) {
const answer = answerTable[j][i % answerTable[j].length];
if (answers[i] === answer) {
score[j]++;
}
}
}
const biggest = Math.max(...score);
const arr = [];
for (let i = 0; i < score.length; i++) {
if (biggest === score[i]) {
arr.push(i + 1);
}
}
return arr;
}
▷ map, filter, reduce 메서드 사용 풀이
const answerTable = [
[1, 2, 3, 4, 5],
[2, 1, 2, 3, 2, 4, 2, 5],
[3, 3, 1, 1, 2, 2, 4, 4, 5, 5],
];
function solution(answers) {
const scoreList = answerTable.map((el, i) => {
const score = answers.reduce((acc, cur, j) => {
return acc + (el[j % el.length] === cur ? 1 : 0);
}, 0);
return { student: i + 1, score };
});
const biggest = Math.max(
...scoreList.map((el) => {
return el.score;
}),
);
return scoreList
.filter((el) => {
return biggest === el.score;
})
.map((el) => {
return el.student;
});
}
출처: 프로그래머스
출처: 코드캠프