codingTest
프로그래머스-모의고사 완전탐색 풀이
에밀오구
2023. 4. 26. 17:47
프로그래머스 문제: 모의고사
https://school.programmers.co.kr/learn/courses/30/lessons/42840
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
나의 풀이 설명과 피드백
function solution(answers) {
//수포자1, 2, 3의 찍는 규칙
let arr1 =[1,2,3,4,5]; // 변수명 man1이 더 명시적
let arr2 =[2,1,2,3,2,4,2,5];
let arr3 =[3,3,1,1,2,2,4,4,5,5];
//수포자1, 2, 3의 규칙으로 마지막 문제까지 찍은 답안
function makeAnswerSheet (arr){
let newarr =[];
for(let i = 0 ; i<answers.length; i++ ){
if(i >=arr.length){ //굳이 If 문으로 작성하지 않아도 i % man1.length 로 정상작동
let num = i % arr.length;
newarr.push(arr[num]);
}else{
newarr.push(arr[i]);
}
}
return newarr;
}
let newarr =makeAnswerSheet(arr1); //수포자1이 마지막문제까지 찍은 답안
let newarr2 =makeAnswerSheet(arr2);
let newarr3 =makeAnswerSheet(arr3);
//수포자들이 맞은 갯수 넣기위한 초기화
//예정: 인덱스 1의 값= 수포자1이 맞춘 갯수, 인덱스 2의 값= 수포자2이 맞춘 갯수
let answer= [0,0,0,0];
for(let j =0;j<answers.length;j ++){
//답안의 번호와 수포자1이 찍은 번호가 같다면
if(answers[j]===newarr[j]){
//answer의 인덱스 1 에 +1 추가
answer[1] = answer[1]+ 1; // answer[1]++; 이 더 클린
}
if(answers[j]===newarr2[j]){
answer[2] =answer[2]+ 1;
}
if(answers[j]===newarr3[j]){
answer[3]=answer[3]+1;
}
}
//수포자들 중에서 가장 많이 맞춘 사람의 갯수 구하기
let whois = Math.max(...answer);
let result =[];
//가장 많이 맞춘 사람의 갯수와 값이 같다면 result배열에 push
//중복일경우 오름차순 해야함으로 인덱스가 낮은 순부터 push
answer.forEach((el,idx)=>{
if(el===whois){
result.push(idx);
}
});
return result;
}
다른 이의 풀이 1
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;
}
다른 이의 풀이 2
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;
}
배운점
- 선언한 변수는 코드 최상단에 작성한 부분
- i%a1.length 에서 어차피 작은 수 % 큰수 경우에도 제대로 작동함으로 if문 쓸 필요가 없이 바로 작성할 수 있다는 점.
ex) 3%5=3 - 알맞게 고른 번호들을 담은 배열의 길이가 곧 수포자가 맞춘 갯수라는 점.
- 화살표함수를 사용해서 가독성을 높인 부분.
-> 다른 이 풀이2. 댓글 중 filter를 세 번 돌린다는 점에서 반복문 하나 안에서 처리하는 것 보다 많이 안 좋은 방식이라는 의견이 있었다.