https://programmers.co.kr/learn/courses/30/lessons/42840
여기서 생각해야할 것은
1,2,3번 수포자들이 일정게 반복하는 규칙을 가지고 문제를 찍기에 나머지 계산법을 활용하는 것과
가장 많은 문제를 맞힌 사람이 한명이 아니라 중복으로 여러명 될 수 있다는 점을 잘 기억해야한다.
나의코드
2022-06-30 02:31 풀이
function solution(answers) {
let one = [1,2,3,4,5]
let two = [2,1,2,3,2,4,2,5]
let three = [3,3,1,1,2,2,4,4,5,5]
let answerOne = []
let answerTwo = []
let answerThree = []
for(i=0; i<answers.length; i++){
if( answers[i] === one[i] ){
answerOne.push(i)
}
if(answers[i] === two[i]){
answerTwo.push(i)
}
if(answers[i] === three[i]){
answerThree.push(i)
}
one.push(one[i])
two.push(two[i])
three.push(three[i])
}
const maxmum = Math.max(answerOne.length, answerTwo.length, answerThree.length )
const student = [{"length" : answerOne.length, "name": 1}, {"length" :answerTwo.length, "name":2}, {"length":answerThree.length, "name": 3 }]
const classify = student.filter(x=>x.length === maxmum)
let result = []
for(k=0; k < classify.length; k++){
result.push(classify[k].name)
}
return result;
}
나는 너무 어렵게 풀었고 가독성 또한 최악이다.
나머지 계산만해도 훨씬 간단했을 것이다.
30분이상 푼것 같다
2023 / 01 / 17 다시풀기
function solution(answers) {
const score = [calculate(answers,1), calculate(answers,2), calculate(answers,3)]
const result = score.reduce((acc,cur,index,arr) => {
if(Math.max(...arr) === cur) acc.push(index + 1)
return acc
},[])
return result
}
const data = Object.freeze({
1 : [1,2,3,4,5],
2 : [2,1,2,3,2,4,2,5],
3 : [3,3,1,1,2,2,4,4,5,5],
})
function calculate(answers, number) {
return answers.reduce((acc,cur,index,arr) => {
if(cur === data[number][index % data[number].length]) acc += 1
return acc
},0)
}
처음에 calculaate 함수가 각 학생들의 맞은 갯수를 파악한다.
그 갯수가 담긴 arr가지고 최대값을 구하고 최대값하고 같은 학생은 누산기에 push해줘서 최종 reduce된 arr를 return하는 코드이다.
push를 사용해서 따로 정렬할 필요는 없다.
계산하는 부분이 딱 두 곳이다.
하나는 학생들의 맞은 갯수를 파악 할 때 다른 한 곳은 맞은 갯수가 최대 값이면 몇 번 학생인지 return해줄 때 이다.
다른 사람 풀이
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와 그안에서 나머지계산법까지 한뒤 길이를 측정해서 max로 빼는 것까지 완벽한 것 같다.
filter 공부가 더 필요하다 개념 정리를 다시해야겠다.
여기서는 filter의 index기능을 정말 잘 사용한 것 같다.
'알고리즘 > 프로그래머스 - JS' 카테고리의 다른 글
[프로그래머스 - JS] level.1 다트 게임 (0) | 2023.01.31 |
---|---|
[프로그래머스] level.1 이상한 문자 만들기 (0) | 2023.01.28 |
[프로그래머스 - JS] level.1 과일 장수 (0) | 2023.01.15 |
[프로그래머스 - JS] level.2 주차 요금 계산 (0) | 2023.01.02 |
[프로그래머스 - JS] level.2 귤 고르기 (0) | 2022.12.31 |