JS 알고리즘 문제풀이/섹션 4. 완전탐색(블루투포스)

3.멘토링

crab. 2022. 1. 14. 11:52

📌강의 정리

이 문제가 블루투포스 완전탐색을 쓰는 대표적인 문제이다.

하나하나의 경우를 전부다 확인해야한다.

앞을 멘토 뒤를 멘티로 한다.

총 경우의 수는 4*4로 16가지이다.

i가 멘토 j가 멘티라고 가정하고 문제를 푼다.

각각의 테스트마다 하나하나 다 비교해야한다.

또한 포문 두개가 더 돈다 총 4중 포문이다.

forfor ij 로 16번 다 돌면서 forfor sk로 하나씩 멘토멘티의 경우를 다 비교해본다.

그렇게 비교하며 예를들어 (3,1)이 맞는 멘토멘티인지 확인하려면

test[k][s] === i test[k][s] === j

를 하며 하나의 멘토 멘티 짝이 모든시험에서 다 통과하는지를 확인한다.

입력 배열을 test로 받고 m테스트갯수를 test.length로 3을 구한다.

학생수n은 test[0].length로 4를 구해 문제의 조건들을 구한다.

이중포문으로 i j가 n번 돌게 하여 i,j 의 16가지를 다 구한다.

그 안에서 다시 포문을 0번부터 m개를 구하고 다시 그 안에서 n번돈다.

이후 test[k][s] === i 로 pi와 pj를 구한다.

이제 이 pi와 pj를 비교하여 pj가 크면 cnt++하여 m과 비교해 같으면 앤서를++한다.

📌느낀점

역대급으로 어려운 문제였다.

처음엔 문제도 해석하기에 따라 문제가 달라져서 잘못이해했었지만

결국에는 풀어냈다.

이 문제를 풀어냄으로써 블루투포스에 아주 조금이나마 성취도를 쌓은 것 같다.

나는 처음부터 등수가 높은 것만 뽑아내 i가 0일때에서 일치하는것만 다시 다른 배열에

집어넣어 그 배열의 길이를 구하는 식으로 했는데 이렇게 하면 풀리긴하지만

포문을 6개써야하고 블루투포스에도 거리가 좀 있으며 복잡하다.

강사님의 방법을 사용하면 블루투포스에도 잘 부합하고 가독성도 좋다.

이 문제를 잘 이해하고 암기하며 내것으로 만들어야겠다.

//220609 추가
<html>
  <head>
    <meta charset="UTF-8" />
    <title>출력결과</title>
  </head>
  <body>
    <script>
      function solution(test) {
        let answer = 0;
        let n = test[0].length;
        let m = test.length;
        let formArr = [];
        let answerArr = [];
        //for문을 돌려 첫번째 배열의 부분집합같은 배열을 만듭니다.
        for (let i = 0; i < m; i++) {
          for (let j = 0; j < n; j++) {
            for (let k = j + 1; k < n; k++) {
              if (i === 0) {
                console.log("처음에 formArr에 집어넣는 배열", [
                  test[i][j],
                  test[i][k],
                ]);
                formArr.push([test[i][j], test[i][k]]);
                console.log("formArr = ", formArr);
              } else {
                //두번째 for문에서 만들어진 부분집합들을 원본과 비교해
                for (let l = 0; l < formArr.length; l++) {
                  if (
                    JSON.stringify(formArr[l]) ==
                    JSON.stringify([test[i][j], test[i][k]])
                  )
                    //있으면 새로운 배열에 넣어주고
                    answerArr.push([test[i][j], test[i][k]]);
                }
              }
            }
          }
          //마지막반복에 이 새로운배열을 첫번째 배열에 넣어줍니다.
          if (i !== 0) formArr = answerArr;
          //새로운 배열 초기화
          answerArr = [];
        }

        //계속 반복하고 마지막에 이 첫번째 배열의 길이를 출력합니다.
        console.log("정답배열은 = ", formArr);
        answer = formArr.length;
        return answer;
      }

      let arr = [
        [3, 4, 1, 2],
        [4, 3, 2, 1],
        [3, 1, 4, 2],
      ];
      console.log(solution(arr));
    </script>
  </body>
</html>
//나의코드
<html>
    <head>
        <meta charset="UTF-8">
        <title>출력결과</title>
    </head>
    <body>
        <script>
            function solution(test){
                let answer=0;
                let arrRes = [];
                let arrTest = [];
                let arrTest2 = [];
                for(let i=0;i<test.length;i++){
                    if(i === 0){
                        for(let j=0;j<test[i].length;j++){
                            for(let k=j+1;k<test[i].length;k++){
                                arrTest.push(test[i][j]);
                                arrTest.push(test[i][k]);
                                arrRes.push(arrTest);
                                arrTest = [];
                            }
                        }
                    }
                    else{
                        console.log(arrRes)
                        for(let j=0;j<test[i].length;j++){
                            for(let k=j+1;k<test[i].length;k++){
                                arrTest.push(test[i][j]);
                                arrTest.push(test[i][k]);
                                for(let l=0; l<arrRes.length; l++){
                                    if(arrRes[l][0] === arrTest[0]){
                                        if(arrRes[l][1] === arrTest[1]){
                                            arrTest2.push(arrTest);
                                        }
                                    }
                                }
                                arrTest = [];
                            }
                        }
                        arrRes = arrTest2;
                        arrTest2 = [];
                    }
                    console.log(arrRes)
                }
                answer = arrRes.length
                return answer;
            }
            let arr=[[3, 4, 1, 2], [4, 3, 2, 1], [3, 1, 4, 2]];
            console.log(solution(arr));
        </script>
    </body>
</html>
//강사님 코드
<html>
    <head>
        <meta charset="UTF-8">
        <title>출력결과</title>
    </head>
    <body>
        <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;
                        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) answer++;
                    }
                }
                return answer;
            }
            
            let arr=[[3, 4, 1, 2], [4, 3, 2, 1], [3, 1, 4, 2]];
            console.log(solution(arr));
        </script>
    </body>
</html>

'JS 알고리즘 문제풀이 > 섹션 4. 완전탐색(블루투포스)' 카테고리의 다른 글

5.K번째 큰 수  (0) 2022.01.14
4.졸업선물  (0) 2022.01.14
2.뒤집은 소수  (0) 2022.01.14
1.자리수의 합  (0) 2022.01.14