본문 바로가기
코딩 테스트 문제 및 풀이

[JS] 코딩 테스트 문제 : 멘토링

by spare8433 2023. 10. 17.

문제 : 멘토링



문제 설명


현수네 반 선생님은 반 학생들의 수학점수를 향상시키기 위해 멘토링 시스템을 만들려고 합니
다. 멘토링은 멘토(도와주는 학생)와 멘티(도움을 받는 학생)가 한 짝이 되어 멘토가 멘티의
수학공부를 도와주는 것입니다.


선생님은 M번의 수학테스트 등수를 가지고 멘토와 멘티를 정합니다.
만약 A학생이 멘토이고, B학생이 멘티가 되는 짝이 되었다면, A학생은 M번의 수학테스트에서
모두 B학생보다 등수가 앞서야 합니다.


M번의 수학성적이 주어지면 멘토와 멘티가 되는 짝을 만들 수 있는 경우가 총 몇 가지 인지
출력하는 프로그램을 작성하세요.


▣ 입력설명

첫 번째 줄에 반 학생 수 N(1<=N<=20)과 M(1<=M<=10)이 주어진다.
두 번째 줄부터 M개의 줄에 걸쳐 수학테스트 결과가 학생번호로 주어진다. 학생번호가 제일
앞에서부터 1등, 2등, ...N등 순으로 표현된다.
만약 한 줄에 N=4이고, 테스트 결과가 3 4 1 2로 입력되었다면 3번 학생이 1등, 4번 학생이
2등, 1번 학생이 3등, 2번 학생이 4등을 의미합니다.


▣ 출력설명

첫 번째 줄에 짝을 만들 수 있는 총 경우를 출력합니다.


▣ 입력예제 1

4 3
3 4 1 2
4 3 2 1
3 1 4 2


▣ 출력예제 1

3
(3, 1), (3, 2), (4, 2)와 같이 3가지 경우의 (멘토, 멘티) 짝을 만들 수 있다.



내코드


// 들어온 순서대로 순위가 정해지는 걸 이용해 멘토 멘티 조합을 만들어 모든 경우에 해당하는 결과를 반환
// '(n1, n2)' : n1 이 멘토 n2 가 멘티
function solution(test) {
  let answer = 0;
  let team = [];

  // 첫번째 시험결과로 인해 만들어질 수 있는 모든 멘토멘티 조합의 경우를 문자형태로 배열을 저장
  test[0].forEach((element, index, arr) => {
    for (let j = index + 1; j < arr.length; j++) {
      team.push(`(${element}, ${arr[j]})`);
    }
  });

  // 수학성적 결과 배열 순회
  for (let index = 1; index < test.length; index++) {
    let tmpTeam = []; // n 번째 시험에서 나오는 멘토멘티 조합 배열
    // n 번째 수학성적 결과의 학생 배열 순회
    test[index].forEach((std, i, arr) => {
      // 1등 학생부터 하위권 학생까지 순회
      for (let j = i + 1; j < arr.length; j++) {
        // 이전 시험결과로 나올 수 있는 멘토멘티 조합과 동일한 부분이 있다면 현재까지 멘토멘티가 가능한 조합으로 판단해 tmpTeam 배열에 저장
        if (team.includes(`(${std}, ${arr[j]})`))
          tmpTeam.push(`(${std}, ${arr[j]})`);
      }
    });

    // n 번째 시험을 거친 후 여전히 가능한 멘토멘티 조합을 team 배열에 저장
    // 무결성을 위한 spread operator
    team = [...tmpTeam];
  }
  console.log(team);
  answer = team.length;
  return answer;
}

let arr = [
  [3, 4, 1, 2],
  [4, 3, 2, 1],
  [3, 1, 4, 2],
];
console.log(solution(arr));



풀이


  1. 들어온 순서대로 순위가 정해지는 걸 이용해 멘토 멘티 조합을 만들어 모든 경우에 해당하는 결과를 반환
  2. 첫번째 시험결과로 인해 만들어질 수 있는 모든 멘토 + 멘티 조합의 경우를 문자형태((n1, n2) : n1 이 멘토 n2 가 멘티)로 배열을 저장
  3. 수학성적 결과를 두 번째 시험결과부터 배열 순회
  4. n 번째 수학성적 결과의 학생 배열 순회하며 index 의 학생보다 하위권 학생과 매칭하여 멘토멘티 조합을 만듦과 동시에 이전 시험결과로 나올 수 있는 멘토멘티 조합과 동일한 조합이 있다면 결과를 저장
  5. n 번째 시험을 거친 후 여전히 가능한 멘토멘티 조합과 경우의 수를 반환




참고

https://www.inflearn.com/course/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4/dashboard