문제를 이해하는 게 어려웠다. 배열안의 숫자가 등수가 아니라, 학생을 의미하는 거였군..
for 문 4번.. 효율성 괜찮아요..?
function solution(test){
//answer는 cnt 3번을 모두 통과해 멘토가 확정된 경우를 의미한다.
let answer=0;
//테스트의 횟수를 의미한다.
m=test.length;
//학생의 명수를 의미한다.
n=test[0].length;
for(let i=1; i<=n; i++){
for(let j=1; j<=n; j++){
//이부분은 수연님의 아이디어! break를 쓰니 아예 for문이 멈춰버려서, continue를 사용해서 i 와 j 가 같은, 즉 나와 내 자신이 매치되는 경우를 제외한다. 메모리절약에 조금이나마 도움이 되려나?
if(i===j) continue;
//cnt 는 짝지어진 i와 j 중에서, j의 수학점수가 더 높은 결과를 얻은 경우를 카운팅한다. let cnt=0;
for(let k=0; k<m; k++){
//먼저, i학생과 j 학생의 등수를 초기세팅한다.
let pi=pj=0;
for(let s=0; s<n; s++){
// i , j 학생을 찾으면 각각 몇등인지 할당한다.
if(test[k][s]===i) pi=s;
if(test[k][s]===j) pj=s;
}
// j학생의 등수가 높을 경우에만 카운트를 올린다.
if(pi<pj) cnt++;
}
// 카운트가 총 테스트 횟수와 일치하면 (모든 테스트에서 더 높은 점수를 얻으면)
//멘토링의 경우의 수를 하나 올린다.
if(cnt===m) answer++;
}
}
// 여기서, const arr = []; arr.push([i,j])를 하면, 어떤 학생이 멘토링 짝을 이루는지도 알 수 있다.
// 요구하는 건 멘토링 경우의 수이므로 answer를 바로 리턴한다.
return answer;
}
let arr=[[3, 4, 1, 2], [4, 3, 2, 1], [3, 1, 4, 2]];
console.log(solution(arr));