JS 알고리즘 문제풀이/섹션 5. 효율성(투포인터 알고리즘, 슬라이딩윈도우, 해쉬)

2.공통원소구하기(Two Pointers Algorithm)

crab. 2022. 6. 14. 07:25
반응형

📌강의정리

이중포문을 이용해서 하면 되긴 하지만 투포인터를 배웠으니 투포인터를 해보자.

arr1,2를 정렬한다.

정렬후 투포인터로 비교하며 같은경우를 push를 하는데 다른경우는 작은경우의

포인터를 증가시킨다.

작은값을 증가시켜야 나중에 같은값을 다시 매칭시킬 수 있지 큰 값을 증가시키면

반대편에 같은값이 있었을 수도 있다.

arr1.sort()로 정렬해준다.

while문으로 조건을 arr1,arr2가 그 배열의 길이보다 작을때로 맞춰주고

같은경우 push로 앤서값에 넣어주고 나머지는 else if , else로 포인터를 증가시켜준다.

sort()는 배열을 문자열로 정렬하기때문에 우리가 원하는 숫자의 정렬이 안된다.

따라서 안에 함수를 새로 설정해주어서 우리가 원하는 방식으로 정렬되게해야한다.

arr1.sort((a,b)⇒a-b); 콜백함수로 정렬기준을 정해주면 숫자정렬이 된다.

 

📌느낀점

내가 푼 방법과 완전히 같이 풀었다.

투포인터알고리즘은 다른 문제를 풀때도 응용하기 좋을 것 같다.

잘 기억하고 잘 사용해야겠다.

220614 +) 과거의 나는 실력이 좋았던건지 안좋았던건지… 과거와 지금을 잘 섞으면 좋을 것 같다.

 

//220614
<html>
  <head>
    <meta charset="UTF-8" />
    <title>출력결과</title>
  </head>
  <body>
    <script>
      function solution(arr1, arr2) {
        let answer = [];
        let p1 = (p2 = 0);
        arr1.sort((a, b) => a - b);
        arr2.sort((a, b) => a - b);
        while (p1 < arr1.length && p2 < arr2.length) {
          if (arr1[p1] === arr2[p2]) {
            answer.push(arr1[p1++]);
            p2++;
          } else p1++;
        }
        return answer;
      }

      let a = [1, 3, 9, 5, 2];
      let b = [3, 2, 5, 7, 8];
      console.log(solution(a, b));
    </script>
  </body>
</html>
//나의 코드
<html>
    <head>
        <meta charset="UTF-8">
        <title>출력결과</title>
    </head>
    <body>
        <script>
            function solution(arr1, arr2){
                let answer=[];
                let n = arr1.length;
                let m = arr2.length;
                let p1=p2=0;
                arr1.sort((a,b)=>a-b);
                arr2.sort((a,b)=>a-b);
                while(p1<n && p2<m){
                    if(a[p1]<b[p2]) p1++;
                    else if(a[p1]>b[p2]) p2++;
                    else{
                        answer.push(a[p1]);
                        p1++;
                        p2++;
                    }
                }
                return answer;
            }
            
            let a=[1, 3, 9, 5, 2];
            let b=[3, 2, 5, 7, 8];
            console.log(solution(a, b));
        </script>
    </body>
</html>
//강사님 코드
<html>
    <head>
        <meta charset="UTF-8">
        <title>출력결과</title>
    </head>
    <body>
        <script>
            function solution(arr1, arr2){
                let answer=[];
                arr1.sort((a, b)=>a-b);
                arr2.sort((a, b)=>a-b);
                let p1=p2=0;
                while(p1<arr1.length && p2<arr2.length){
                    if(arr1[p1]==arr2[p2]){
                        answer.push(arr1[p1++]);
                        p2++;
                    }
                    else if(arr1[p1]<arr2[p2]) p1++;
                    else p2++;
                }              
                return answer;
            }
            
            let a=[1, 3, 9, 5, 2];
            let b=[3, 2, 5, 7, 8];
            console.log(solution(a, b));
        </script>
    </body>
</html>
반응형