이번 문제는 for문을 이용해 주어진 rank(랭킹)와 attendance(참석 여부) 배열에 맞춰 참석 하는 사람들만 저장하는 배열 (attendedStudent)와 해당 참석자들의 등 번호(indexOf 메서드로 저장한 indexIs) 배열을 저장한 후
다음 이중 for문을 돌려 attendedStudent 가장 작은 값(랭킹이 작아야 배열에서 성적이 우수한 학생이므로)을 찾은 값을 하나의 변수에 집어넣고, for문이 도는 attendedStudent 배열에서 해당 변수의 값과 일치할 때 (성적이 우수한 학생을 찾았을 때) rangedRank 배열에 해당 indexIs 메서드의 현재 i의 값(성적이 우수한 학생의 등 번호)를 push 한 후
attendedStudent배열과 indexIs 배열의 현재의 i값(성적이 가장 우수한 학생과 그 등 번호)를 삭제 (splice)한 후 다시 for문을 돌아 다음 성적이 우수한 학생과 이에 대한 작업을 처리하는 방식으로 구현했습니다.
function solution(rank, attendance) { let answer = 0; let attendedStudent = []; // 최종 참석자 명단을 저장할 배열 let backNumber = []; // 최종 참석자의 등번호를 저장할 배열 let rangedRank = []; // 순위대로 등번호를 다시 저장할 배열 for (let i = 0; i < rank.length; i++) { // 첫번째 for문은 해당 참석자의 참여 여부가 true일 경우 이에 위치한 랭커(rank)를 참석자 명단에 저장하고 해당하는 등 번호(i의 값은 해당 참석자의 인덱스라고 봐도 무방)을 등 번호 배열에 저장. if (attendance[i] === true) { attendedStudent.push(rank[i]); backNumber.push(i); // backNumber 배열에 인덱스를 직접 추가 } } let length = attendedStudent.length; // attendedStudent의 배열을 length 변수에 저장 (아래의 두번째 for문을 돌리면서 splice로 인해 해당 배열의 length가 줄어들기 때문) for(let i = 0 ; i < length ; i++){ // 첫번째 for문은 length에 저장된 길이만큼 돌리고 for(let j = 0 ; j < attendedStudent.length ; j++){ // 두번째 for문은 attendedStudent의 길이만큼 반복하면서 let minValue = Math.min(...attendedStudent); // 최솟값 변수에 참석자 명단의 학생들 중 값이 가장 낮은 값(그룹 내에 가장 우수한 학생)을 담아주는데, 해당 메서드는 배열을 받을 때 배열 그 자체를 하나의 인자로 받으므로 연산을 할 수 없습니다. 그래서 스프레드 연산자를 사용해 배열의 값들을 전부 분해해 줍니다.) if (attendedStudent[j] === minValue) { // 만약 참석자 명단 중에 가장 우수한 학생을 찾는다면 rangedRank.push(backNumber[j]); // rangedRank에 해당 학생을 push 해준 후 backNumber.splice(j, 1); // 등번호 명단의 해당 학생을 splice로 제거 attendedStudent.splice(j, 1); // 마찬가지로 참석자 명단의 해당 학생을 splice로 제거해 줍니다. } } } return answer = ((10000 * rangedRank[0]) + (100 * rangedRank[1]) + rangedRank [2]); // 이렇게해서 최종적으로 반환 된 rangedRank의 값들을 이용해 순차적으로 연산한 결과값을 answer에 할당 후 반환시켜 줍니다. }