2022/01/18) 3. 멘토링 [완전탐색(블루투포스)]

굥굥이·2022년 1월 18일
0
post-thumbnail

1. 문제

<멘토링>
: 멘토링은 멘토(도와주는 학생)와 멘티(도움을 받는 학생)가 한 짝이 되어 멘토가 멘티의 수학공부를 도와주는 것이다. M번의 수학 테스트 등수를 가지고 멘토와 멘티를 정한다.
만약 A학생이 멘토이고, B학생이 멘티가 되는 짝이 되었다면, A학생은 M번의 수학테스트에서 모두 B학생보다 등수가 앞서야 한다.
M번의 수학성적이 주어지면 멘토와 멘티가 되는 짝을 만들 수 있는 경우가 총 몇가지인지 출력하는 프로그램을 작성한다.
(학생번호가 제일 앞에서부터 1등, 2등, ...N등 순으로 표현된다. 만약 한 줄에 N=4이고, 테스트 결과가 3 4 1 2로 입력되었다면 3번 학생이 1등, 4번 학생이 2등, 1번 학생이 3등, 2번 학생이 4등을 의미한다.)

2. 해결 방법

  1. 모든 조건을 무시한 채, 멘토 멘티가 짝을 이룰 수 있는 경우의 수를 생각해보자. 4명이므로 4*4=16가지의 경우의 수가 있다. (만약 멘토가 1번 학생이라면, 멘티는 1,2,3,4번 학생이 될 수 있음) 그리하여 우선 for문을 짜보면, for(let i = 1; i <=n; i ++) for(let j = 1; j <= n; j++) 이렇게 이중 for문이 나온다! 콘솔로 i와 j를 찍어서 확인해보면 된다!
  2. 이차원 배열(test[k][s])에서 멘토(i)를 찾아서 등수(s)를 구한다(pi에 넣어준다)! 멘티(j)도 마찬가지로, 이차원 배열에서 멘티를 찾아서 등수(s)를 구한다(pj에 넣어준다)! 그리하여 pi가 pj보다 작다면(등수비교이므로 작은 게 좋은 거임) cnt++;를 해준다.
  3. cnt===m(3)이여야지 모든 테스트에서 멘토가 멘티를 이긴 게 되므로, 이럴 경우 answer++;해준다.
  4. 초기화 주의!!!

3. 정답

        <script>
            function solution(test){
                let answer=0;
                m=test.length; //몇 판
                n=test[0].length; //사람 수
                for(let i=1; i<=n; i++){
                    for(let j=1; j<=n; j++){
                        let cnt=0;
                        // console.log(i,j);
                        for(let k=0; k<m; k++){
                            let pi=pj=0;
                            for(let s=0; s<n; s++){//i가 1이고 j가 1이면 둘 다 똑같은 등수다. 그러므로 if(pi<pj)cnt++; 는 자동으로 패스가 된다.
                                if(test[k][s]===i) pi=s;
                                if(test[k][s]===j) pj=s;
                            }
                            if(pi<pj) cnt++;
                        }
                        if(cnt===m) answer++;
                    }
                }
                return answer;
            }
            let arr=[[3, 4, 1, 2], [4, 3, 2, 1], [3, 1, 4, 2]];
            console.log(solution(arr));
        </script>
        <script> //어떤 값들이 들어 왔는지 확인하고 싶다면 tmp배열 생성해서 확인해 보기
            function solution(test){
                let answer = 0, tmp=[];
                m=test.length; 
                n=test[0].length; 
                for(let i = 1; i <= n; i++){
                    for(let j = 1; j <= n; j++){
                        let cnt = 0;
                        for(let k=0; k < m; k ++){
                            let pi=pj=0;
                            for(let s=0; s<n; s++){ 
                                if(test[k][s]===i) pi=s;
                                if(test[k][s]===j) pj=s;
                            }
                            if(pi < pj) cnt++;
                        }
                        if(cnt===m){
                            tmp.push([i,j])
                            answer++;
                        } 
                    }
                }
                console.log(tmp)
                return answer;
            }
            let arr=[[3, 4, 1, 2], [4, 3, 2, 1], [3, 1, 4, 2]];
            console.log(solution(arr));
        </script>

4. 내 코드와 비교 그리고 반성

문제 이해 제대로 못함.. 문제 예시만 읽었어도 이해했을텐데, 왜 자꾸 대충 읽냐고; 학생이름이 숫자가 되니까 너무 헷갈린다. 그런데 이게 찐 블루투포스구나. 점점 어려워지고 있긴 하지만, 나름 흥미진진하군. 회사에서 며칠 동안 바빠서 바쁜 거 좀 지나가면 할까했는데, 미루지 않고 했군. 잘했어.

profile
아자아자 파이띵굥!

0개의 댓글