article thumbnail image
Published 2022. 6. 13. 23:59
멘토링
현수네 반 선생님은 반 학생들의 수학점수를 향상시키기 위해 멘토링 시스템을 만들려고 합니
다. 멘토링은 멘토(도와주는 학생)와 멘티(도움을 받는 학생)가 한 짝이 되어 멘토가 멘티의
수학공부를 도와주는 것입니다.
선생님은 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 //1 ,2 ,3 ,4등
4 3 2 1
3 1 4 2
▣ 출력예제 1
3
(3, 1), (3, 2), (4, 2)와 같이 3가지 경우의 (멘토, 멘티) 짝을 만들 수 있다.

 
방법?
1. for 문으로 모든 학생을 돌려줄 반복문이 필요 2개!
2. for 문으로 arr 를 돌려준다. 어떻게?
   해당 학생이 몇등인지. 한배열에 멘토가 앞서있으면 카운트 를 1씩 업!
3. count === 3 (arr.length) 이면 모든 테스트 결과에서 앞서는 거니까 answer를 1씩 업!

🙋🏻‍♀️작성코드

<html>

<head>
  <meta charset="UTF-8">
  <title>출력결과</title>
</head>

<body>
  <script>
    function solution(test) {
      let answer = 0;
      let count = 0;
      let mento = 0;
      let menti = 0;
      for (let i = 1; i <= test[0].length; i++) { // i=1 이유는? 우리는 1,2,3,4 가 필요, i의 초기값은 1, 그냥 크다고 하면 1,2,3 까지밖에 조건이 안되서 크거나 같다라고 넣어줌
      // 학생중에 멘토를 선정, 큰배열안에 작은배열에 접근해야하니까 test[0].length 로 접근,
        for (let j = 1; j <= test[0].length; j++) {  // 멘티선정 
          count = 0  // 다음 멘토,멘티 선정을 위하여 count를 0으로 초기화 
          for (let k = 0; k < test.length; k++) { // 큰 배열의 테스트결과를 돌리는 반복문
            for (let s = 0; s < test[0].length; s++) { // 작은 배열의 테스트 결과중 학생의 순위를 탐색하는 반복문
              if (test[k][s] === i) { // i랑 비교하여 멘토가 몇등인지 확인함
                mento = s  // 0 1 2 3 중에 하나를 넣어주는것 s의 인덱스값을 넣어준다.
                //test[k][s]를 넣어주면 안됨 why? test[k][s]는 배열의 값이라서 (3, 4, 1, 2) 
                //몇등인지 확인해야하니까 우리가 필요한건 0 1 2 3 중의 하나의 인덱스 값이 필요! 
              }
              if (test[k][s] === j) { // 멘티가 몇등인지 확인
                menti = s
              }
            }
            if (mento > menti) { // 멘토의 등수가 멘티의 등수보다 높으면 count+1
              count = count + 1
            }
          }
          if (count === test.length) { // 모든 테스트 결과와 count가 같다면 answer + 1
            answer = answer + 1
          }
        }
      }
      return answer;
    }
    let arr = [[3, 4, 1, 2], [4, 3, 2, 1], [3, 1, 4, 2]];
    console.log(solution(arr));
  </script>
</body>

</html>

우선 문제를 이해해보자, n명의 반 학생수가 주어지고

멘토와 멘티가 되는 짝을 만들 수있는 경우의 수를 출력하는 문제이다.

조건은 멘토는 멘티보다 시험 성적이 좋아야한다. (ex) 멘토가 2등이면 멘티는 3등 4등이어야한다.)

 

일단 for문으로 모든 학생을 접근한다. 

1번 for문은 멘토를 할 학생을 뽑아줌 => 첫번째 반복문은 i에 1~4번 학생이 몇번인지를 판별 해주는 반복문이다.

(1번~4번학생까지 판별하기 위해서 [3,4,1,2] 의 배열이면 [3===i, 4===i,1===i,2===i] 을 비교해서 판별해줌)

2번 for문은 멘티를 할 학생을 뽑아줌 

 

여기서 for문이 두개인 이유는

반복문이 하나면 나자신하고 밖에 비교를 안하기때문이다.

예를들면, [3,4,1,2] 배열에

[3,4] [3,1] [3,2] 이렇게 밖에 비교를 안한다. 

우리가 원하는것은 [4,1] [4,2] [1,2] 나자신을 뺀 값도 비교하는것을 원하기때문에 for문을 두개 넣어줘야 한다.

for (let i = 1; i <= test[0].length; i++) {
   for (let j = 1; j <= test[0].length; j++) {
   ..
   ..
   ..
   ..
   .
   
   let arr = [[3, 4, 1, 2], [4, 3, 2, 1], [3, 1, 4, 2]];

i가 1부터 시작하는이유는 0등은 존재하지않기때문 => 1등부터 시작 

우리는 멘토를 할 학생을 뽑아줘야해니까 큰 배열 안에 작은 배열로 접근해야함.

여기까지가 멘토, 멘티 선정을 끝!

 

다음 for문을 사용하여 이번엔 해당학생이 몇 등인지를 데스트 결과를 반복문으로 돌려준다.

arr의 첫번째 인덱스로 반복문을 돌려주고 그안에 인덱스에 또 접근을하고,

조건문을 사용하여 멘토와 멘티가 몇 등인지 확인해준다.

(test인덱스가 i랑 같으면 mento값에 s(s는 [0] [1] [2] [3]중 하나로 index 값이다)를 대입시킨다.)

멘토와 멘티의 등수를 확인했으면 

 if (mento > menti) {
     count = count + 1
 }
 
(mento index값과 menti index값을 비교해서 멘토의 index가 더 큰 경우, 카운터를 1 올려준다.)
 

멘토의 등수가 멘티보다 높으면 count를 1씩 올려준다.

멘토가 3번학생이고 멘티가 1번학생이라 할때, 

첫번째 시험(arr[0])에서는 3번이 1번 앞에있으니까 조건에 부합하고 

카운터를 1을 올려주는것이다.

두번째 시험(arr[1])도 3번이 1번 보다 앞에있으니 카운터 1을 또 올려주고 

세번째 시험(arr[2])도 3번이 1번 보다 앞이고 카운터 1을 올려주면 된다.

 

마지막으로 세번의 반복문을 다돌았을땐, 세번의 시험이니까

총 카운터는 3이고 이 결과값을(count) === test.length 와 비교해서 

같으면 answer에 넣어주면 결과값 3이 잘 출력된다.

'알고리즘' 카테고리의 다른 글

[알고리즘 문제] 4-5번  (0) 2022.06.16
[알고리즘 문제] 4-4번  (0) 2022.06.16
[알고리즘 문제] 4-2번  (0) 2022.06.13
[알고리즘 문제] 4-1번  (0) 2022.06.11
[알고리즘 문제] 3-5번  (0) 2022.06.10
복사했습니다!