반응형
문제
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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 함수를 작성해주세요.
의식의 흐름
student 1,2,3 변수 선언해서 배열로 규칙을 적어준다.
for 문과 %을 이용해서 정답갯수 카운트.
정답 갯수 3개를 비교만 하면 된다.
나의 코드
function solution(answers) {
let answer = [];
let student1 = [1,2,3,4,5]
let student2 = [2,1,2,3,2,4,2,5]
let student3 = [3,3,1,1,2,2,4,4,5,5]
let answer1 = 0;
let answer2 = 0;
let answer3 = 0;
for ( let i =0; i < answers.length; i++){
if(answers[i] == student1[i%5]){
answer1 ++
}
if(answers[i] == student2[i%8]){
answer2 ++
}
if(answers[i] == student3[i%10]){
answer3 ++
}
}
let tmp_answer = []
tmp_answer.push(answer1,answer2,answer3)
tmp_answer.sort((a,b)=>b-a)
let answer_value = (tmp_answer[0] > tmp_answer[1]) ? 1 : (tmp_answer[1] > tmp_answer[2]) ? 2 : 3
switch(answer_value){
case 1:
answer.push(1)
break
case 2:
answer.push(1,2)
break
case 3:
answer.push(1,2,3)
break
}
answer.sort((a,b)=>a-b)
return answer;
}
문제점 : 그냥 배열 변수하나만 선언했으면 되는걸 변수따로, 배열 따로 선언함.
정답갯수를 구하고 이를 처리하는데 너무 어렵게 처리함.
최대한 간결하고 포인트를 잡는 연습을 해야겠다.
지금은 하드코딩으로 나눗셈을 했는데, 길이가 변화하면 student1.length 처럼 하드코딩을 피하자.
블로그 참조 후 수정 코드
출처 : 블로그
function solution(answers) {
let answer = [];
let student1 = [1,2,3,4,5]
let student2 = [2,1,2,3,2,4,2,5]
let student3 = [3,3,1,1,2,2,4,4,5,5]
let tmp_answer = [0,0,0]
for ( let i =0; i < answers.length; i++){
if(answers[i] == student1[i%student1.length]){
tmp_answer[0] ++
}
if(answers[i] == student2[i%student2.length]){
tmp_answer[1] ++
}
if(answers[i] == student3[i%student3.length]){
tmp_answer[2] ++
}
}
let max = Math.max(...tmp_answer)
for ( let j =0 ; j < tmp_answer.length;j++){
if(tmp_answer[j] === max ){
answer.push(j+1)
}
}
return answer;
}
다른사람 풀이
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() 메서드는 주어진 함수의 테스트를 통과하는 모든 요소를 모아 새로운 배열로 반환합니다.
Math.max를 통한 최대값 구하는 법도 앞으로 이용해보자.
반응형
'코딩테스트' 카테고리의 다른 글
[프로그래머스] level1. 같은 숫자는 싫어 (javascript) (0) | 2021.04.09 |
---|---|
[프로그래머스] level1. 3진법 뒤집기 (javascript) (0) | 2021.04.08 |
[프로그래머스] level1. 체육복 ( javascript) (0) | 2021.04.08 |
[프로그래머스] level1. 완주하지 못한 선수 (javascript) (0) | 2021.04.06 |
[프로그래머스] level1. 두 개 뽑아서 더하기 (javascript) (0) | 2021.03.29 |