본문 바로가기
문제풀이/인프런 알고리즘 문제풀이

4-3 멘토링

by dev_kong 2021. 12. 20.
728x90
728x90

문제설명

n번의 테스틀 거쳐서, 멘토와 멘티를 정하려고 한다.

멘토는 모든 시험에서 멘티보다 등수가 높아야한다.

n번의 테스트결과가 주어지면 멘토와 멘티가 정해지는 경우는 몇 가지 인지 출력해라.

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

위의 경우에서 첫번째 테스트 결과는 

3번학생이 1등, 4번학생이 2등, 1번학생이 3등, 2번학생이 4등이다.

접근방법

for문을 여러번 돌려야 겠다는 건 대충 직감적으로 왔다.

하나하나 다 비교를 하기 위해,

무려 4중 for문을 이용해

i번 학생과 j번 학생을 지정하고

i의 k번째 테스트의 등수(s)를 grade1 에 할당하고

j의 k번째 테스트의 등수(s)를 grade2에 할당해 준다.

grade1이 grade2 보다 작으면(=k 번째 테스트에서 i가 j 보다 등수가 높으면)

count에 1을 더 해준다.

n번의 테스트를 모두 확인했을 때,

count와 n이 일치하면(=n번의 테스트 모두 i 가 j보다 등수가 높으면)

answer에 1을 더해준다.

이런 식으로 모든 조합을 확인해줬다.

 

function solution(arr) {
  let answer = 0;
  const numOfStudent = arr[1].length;
  const numOfTest = arr.length;

  for (let i = 1; i <= numOfStudent; i++) {
    for (let j = 1; j <= numOfStudent; j++) {
      let grade1 = 0;
      let grade2 = 0;
      let match = 0;
      for (let k = 0; k < numOfTest; k++) {
        for (let s = 0; s < numOfStudent; s++) {
          if (arr[k][s] === i) {
            grade1 = s;
          }
          if (arr[k][s] === j) {
            grade2 = s;
          }
        }
        if (grade1 < grade2) match += 1;
      }
      if (match === numOfTest) answer += 1;
    }
  }
  return answer;
}

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

for 문이 4개라 조금 복잡하다.

 

한 구다리씩 확인을 해보자.

 

function solution(arr) {
  let answer = 0;
  const numOfStudent = arr[1].length;
  const numOfTest = arr.length;

학생수를 나타내는 변수를 선언하고 할당하고

테스트 횟수를 나타내는 변수를 선언하고 할당했다.

answer에는 일단 무지성으로 0을 할당했다.

 

function solution(arr) {
  let answer = 0;
  const numOfStudent = arr[1].length;
  const numOfTest = arr.length;

  for (let i = 1; i <= numOfStudent; i++) {
    for (let j = 1; j <= numOfStudent; j++) {
      let grade1 = 0;
      let grade2 = 0;
      let match = 0;

우선 앞에 두개의 for문을 통해

모든 학생을 i 번 학생과 j번 학생을 하나하나 확인할 수 있게 조건을 설정한다.

grade1 과 grade2, match는 for문이 돌때 마다 초기화를 위해 0을 할당해준다.

 

function solution(arr) {
  let answer = 0;
  const numOfStudent = arr[1].length;
  const numOfTest = arr.length;

  for (let i = 1; i <= numOfStudent; i++) {
    for (let j = 1; j <= numOfStudent; j++) {
      let grade1 = 0;
      let grade2 = 0;
      let match = 0;
      for (let k = 0; k < numOfTest; k++) {
        for (let s = 0; s < numOfStudent; s++) {
          if (arr[k][s] === i) {
            grade1 = s;
          }
          if (arr[k][s] === j) {
            grade2 = s;
          }
        }
        if (grade1 < grade2) match += 1;
      }
      if (match === numOfTest) answer += 1;
    }
  }
  return answer;
}

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

for문 두개를 더 이어붙인다.

k는 몇번째 테스트인지, s는 해당 테스트의 등수를 확인할 수 있다.

arr[k][s]가 i와 일치하면, grade1 에 s를 할당하고

arr[k][s]가 j와 일치하면, grade2에 s를 할당한다.

grade1이 grade2보다 낮으면 match에 1을 더해준다.

마지막으로 match와 테스트 횟수가 일치하면 answer에 1을 더해준다.

 

위 입력 예제의 경우

출력되는 값은 3이고,

멘토링이 이뤄지는 경우는 (3,1) , (3,2) , (4,2)이다.

728x90
728x90

'문제풀이 > 인프런 알고리즘 문제풀이' 카테고리의 다른 글

4-5 k번째 큰수  (0) 2021.12.20
4-4 졸업선물  (0) 2021.12.20
4-2 뒤집은 소수  (0) 2021.12.14
4-1 자릿수의 합  (0) 2021.12.14
격자판 최대합  (0) 2021.12.10

댓글