https://programmers.co.kr/learn/courses/30/lessons/42840
코딩테스트 연습 - 모의고사
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는
programmers.co.kr
여기서 생각해야할 것은
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 |