IF - 멘토링

Goody·2021년 4월 8일
0

알고리즘

목록 보기
82/122

문제

현수네 반 선생님은 반 학생들의 수학점수를 향상시키기 위해 멘토링 시스템을 만들려고 합니
다. 멘토링은 멘토(도와주는 학생)와 멘티(도움을 받는 학생)가 한 짝이 되어 멘토가 멘티의
수학공부를 도와주는 것입니다.
선생님은 M번의 수학테스트 등수를 가지고 멘토와 멘티를 정합니다.
만약 A학생이 멘토이고, B학생이 멘티가 되는 짝이 되었다면, A학생은 M번의 수학테스트에서
모두 B학생보다 등수가 앞서야 합니다.
M번의 수학성적이 주어지면 멘토와 멘티가 되는 짝을 만들 수 있는 경우가 총 몇 가지 인지
출력하는 프로그램을 작성하세요.


예시

InputOutput
[[3,4,1,2],[4,3,2,1],[3,1,4,2]]3

풀이 및 회고

  • 학생 4 명이 2명 씩 짝짓는 모든 경우의 수를 검사해야 하므로, 4*4=16 번 루프를 돌아야 한다.
  • 1부터 4까지 도는 i와 j 이중 루프를 만들고, 모든 수학테스트에서 멘티보다 앞섰음을 증명하기 위해 카운트변수를 초기화한다.
  • 위 이중 루프 안에 또 주어진 배열의 길이만큼 도는 k 루프를 만들고, pi는 멘토후보, pj는 멘토후보로 초기화한다.
  • k루프 안에 학생 수만큼 도는 s 루프를 만들고, 배열[k][s]i와 같으면 이번 루프에서 멘토 pi는 i등이라는 뜻이다. 똑같이 배열[k][s]j 와 같으면 이번 루프에서 멘티 pj는 j등이다.
  • s 루프에서 멘토 멘티의 등수가 정해졌다면, k 루프에서 멘토가 멘티보다 등수가 높을 때만 카운트를 1 늘린다.
  • k 루프가 끝났을 때 카운트가 배열의 길이와 같다면, 모든 수학 테스트에서 pi가 pj보다 등수가 높았다는 뜻이므로, pi는 pj의 멘토가 될 수 있다. answer를 1 늘린다.
  • 너무 어려워서 해설을 보고 풀었는데, 이런 다중 for문에 익숙해지도록 자꾸 연습해야 할 것 같다. for문의 새로운 효용을 본 것 같다.

코드

const solution = (test) => {
    let answer = 0;
    
    for(let i = 1; i <= test.length; i++ ){
        for(let j = 1; j <= test.length; j++) {
            let cnt = 0;
            for(let k = 0; k < test.length; k++) {
                let pi = pj = 0;
                for(let s = 0; s < test[0].length; s++) {
                    if(test[k][s] === i) pi = i;
                    if(test[k][s] === j) pj = j;
                }
                if(pi < pj) cnt++;
            }
            if(cnt === test.length) answer++;
        }
    }
    return answer;
    
}

0개의 댓글