🔎 문제
🧩 구현과정 및 코드
개인 토글 영역에 구현 과정과 코드를 자유롭게 작성해주시면 됩니다.
사용할 데이터 구조와 풀이 방향성
적용할 알고리즘 혹은 메서드
수영
구현
- 완전 탐색(forEach 함수 사용)
- counts: 각 students의 정답 개수를 담은 배열
코드
function solution(answers) { const answer = [] const counts = Array(3).fill(0); const students = [[1, 2, 3, 4 ,5], [2, 1, 2, 3, 2, 4, 2, 5], [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]] // 완전 탐색 answers.forEach((question, number) => { students.forEach((student, index) => { if (question === student[number % student.length]) { // 정답이면 개수 체크 counts[index]++; } }) }) const max = Math.max(...counts) // max값이 0이면 빈 배열 반환 if (max === 0) return answer // 최고 점수인 사람의 (index + 1)을 answer.push counts.forEach((count, index) => count === max ? answer.push(index + 1) : null) // 오름차순 정렬 return answer.sort(); }
정은
구현
- 수포자들의 정답 패턴을 배열에 등록
- 한문제씩 세사람의 답과 비교, 맞으면 해당하는 수포자 idx에 점수+1
- 배열의 최대값을 가진 인덱스+1 출력
코드
def solution(answers): result = [0,0,0] supo_answers = [[1,2,3,4,5],[2, 1, 2, 3, 2, 4, 2, 5],[3, 3, 1, 1, 2, 2, 4, 4, 5, 5]] for idx, answer in enumerate(answers): for supo_idx, supo_arr in enumerate(supo_answers): result[supo_idx] += (answer == supo_arr[idx%len(supo_arr)]) best = [] max_result = max(result) for i in range(len(result)): if max_result == result[i]: best.append(i+1) return best
종혁
구현
answers
라는 문제 정답 배열과 각 학생의 배열을 비교해보면서 - 각 학생들이 몇개씩 맞췄는지 비교
- 학생들의 문제풀이에 반복되는 패턴이 존재 - 몇번째 문제에 어떤 답을 선택했는지 알 수 있음
코드
function solution(answers) { //문제 - 10000개 //1번은 5번마다 패턴 반복 - 문제번호 % 5 //2번 8 //3번 10 let result = [[1,0],[2,0],[3,0]] const stu1 = [1,2,3,4,5] const stu2 = [2,1,2,3,2,4,2,5] const stu3 = [3,3,1,1,2,2,4,4,5,5] for(let i=0;i<answers.length;i++){ const answer = answers[i] if(stu1[i % 5] === answer){ result[0][1] ++ } if(stu2[i % 8] === answer){ result[1][1] ++ } if(stu3[i % 10] === answer){ result[2][1] ++ } } const max = Math.max(...result.map(el => el[1])) result.sort((a,b) => { if(a[1] === b[1]){ return a[0] - b[0]//맞춘갯수가 같은경우 학생번호 기준으로 }else{ return b[1] - a[1]//맞춘갯수 기준으로 내림차순 } }) //맞춘 값은 내림차순 - 같을 경우 학생 번호 오름차순 //[ [ 1, 5 ], [ 2, 0 ], [ 3, 0 ] ] const b = result.filter(el => el[1] >= max).map(el => el[0])//동점자 있을경우 return b }
재웅
구현
- 학생별 패턴을 저장하여 채점
- 계산된 점수를 중복 고려하여 계산
코드
function solution(answers) { const answer = []; let [student1,student2,student3] = [0,0,0] const answer1 = [1,2,3,4,5] const answer2 = [2,1,2,3,2,4,2,5] const answer3 = [3,3,1,1,2,2,4,4,5,5] for(let i=0;i<answers.length;i++){ if(answers[i] === answer1[i%answer1.length]){student1+=1} if(answers[i] === answer2[i%answer2.length]){student2+=1} if(answers[i] === answer3[i%answer3.length]){student3+=1} } const scores = [student1,student2,student3] scores.forEach((element,i)=>{ if(element === Math.max(...scores)){ answer.push(i+1) } }) return answer; }
✏️ 후기
문제를 풀고 느낀 점, 막혔던 부분 혹은 개선 사항 등을 자유롭게 작성해주시면 됩니다.
수영
- 1단계에 비해 시간이 비교적 오래 걸렸다
- 고민 됐던 점: 수포자 3명 각각 찍으려는 번호의 개수가 다른 점
→ 나눗셈 연산
student[number % student.length]
정은
- 변수명에서 살짝 어지러웠습니다
종혁
- 제일 많이 맞춘 사람을 찾는 과정은 어렵지 않았는데, 정답을 리턴하는 과정에서 코드가 좀 복잡해진 것 같다
재웅