Algorithm | 멘토링

🚀·2021년 9월 17일
1

Algorithm

목록 보기
1/5
post-thumbnail

9 / 17

📚 문제

멘토링

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

인자로 수학테스트 결과가 학생 번호로 주어진다. 학생번호가 제일 앞에서부터 1등, 2등, ...n등 순으로 표현된다.

스스로 해결 여부

⭕️ 👏🏻 (두시간에 걸쳐서 간신히 풀었다ㅜㅜ....)

🔍 문제 접근

  1. 최대한 어렵지 않게 접근하려고 했다. 어렵고 복잡하게 접근할수록 더 코드가 복잡해지기에..
    (지금 푼 코드도 사실 복잡한 것 같긴하지만...)
  2. 배열이 주어지면 각 숫자는 학생의 이름이다. 그리고 순서는 학생의 등수이다. 다행히 학생이름이 숫자이기에 for문을 통해 접근할 수 있었다. i는 멘토가 될 학생이다. 또 j는 멘티가 될 학생이다.
  3. 각각의 역할을 부여했을때, 모든 수학 성적에서 i의 등수가 j의 등수보다 작을때의 경우의 수를 구한다.

👩🏻‍💻 코드

const getMentoringNumberOfCase = (arr) => {
  let num = 0
  for (let i = 1; i < arr[0].length + 1; i++) {
    for (let j = 1; j < arr[0].length + 1; j++) {
      const arr1 = []
      for (let z = 0; z < arr.length; z++) {
        if (arr[z].indexOf(i) < arr[z].indexOf(j)) {
          arr1.push(true)
        } else {
          arr1.push(false)
        }
      }
      if (arr1.every((el) => el === true)) {
        num++
      }
    }
  }
  return num
}

console.log(
  getMentoringNumberOfCase([
    [3, 4, 1, 2],
    [4, 3, 2, 1],
    [3, 1, 4, 2],
  ])
) // 3
console.log(
  getMentoringNumberOfCase([
    [1, 3, 2, 4, 5],
    [5, 3, 1, 2, 4],
    [3, 5, 2, 1, 4],
  ])
) // 4

🕵🏻‍♀️ 문제 풀이

  1. i와 j를 학생의 이름으로 구분한 후 이중 for문을 통해 각각 멘토일때와 멘티일때를 비교한다.
  2. 그 안의 for문을 통해 각 수학성적등수의 경우를 비교한다.
  3. 만약 z번째의 수학성적등수중 i의 등수가 j의 등수보다 작으면 (i가 더 시험을 잘보면) arr1이라는 값에 true를 넣고, 만약 그렇지 않으면 false를 넣는다.
    (이 과정에서 모든 수학성적등수의 모든 값이 조건을 만족했을때의 경우의 수를 구하기 위해 이것저것 생각해봤는데 달리 방법이 생각나지 않았다..)
  4. 따라서 arr1의 모든 요소가 true일때 num에 1씩 더해주고, num의 값을 리턴했다.
  5. 여기서 배열의 every라는 메소드를 처음 사용했는데 이 메소드는 배열의 모든 요소가 어떤 조건을 만족하면 true를 반환한다.

0개의 댓글