본문 바로가기
Algorithm/JavaScript

[투포인터] 공통원소 구하기

by _sweep 2021. 12. 15.

자바스크립트 알고리즘 문제풀이 강의를 듣고 정리한 내용입니다.

 

 

 

 

📋 문제

두 개의 배열이 주어지면 주어진 배열들의 공통 원소를 추출하여 오름차순으로 출력한다.

 

 

👉 입력

첫 번째 줄에 첫 번째 배열의 크기 N이 주어진다.

두 번째 줄에 N개의 원소가 주어진다.

세 번째 줄에 두 번째 배열의 크기 M이 주어진다.

네 번째 줄에 M개의 원소가 주어진다.

 

이때 원소는 각 배열에 대해 중복이 없이 주어지며 N과 M은 1 이상 30,000 이하의 수를 가진다.

 

 

👈 출력

두 배열의 공통원소를 오름차순으로 정렬하여 출력한다.

 

 

📝 풀이

 

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 (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, 9];
console.log(solution(a, b));

 

주어진 배열이 정렬되어 있지 않으므로 투 포인터 알고리즘을 사용하기 위해 먼저 arr1과 arr2를 오름차순으로 정렬한다.

p1, p2를 각 배열의 첫 번째 원소를 가리키도록 한 뒤 각 배열의 길이만큼 while문을 돌린다.

 

while문 안에서 p1이 가리키는 arr1의 원소와 p2가 가리키는 arr2의 원소가 동일하다면 이 원소를 answer에 삽입한 후 p1과 p2가 각 배열의 다음 원소를 가리키도록 증가시킨다.

 

p1이 가리키는 arr1의 원소와 p2가 가리키는 arr2의 원소가 동일하지 않다면 이 두 값을 비교한다.

값을 비교하는 이유는 둘 중 작은 값은 다른 배열에 등장할 여지가 없지만 큰 값은 등장할 여지가 있기 때문이다.

 

값을 비교해 더 작은 원소를 가진 포인터의 값을 증가시킨다.

 

while문의 순회가 끝나 arr1과 arr2 중 하나라도 순회가 끝났다면 다른 값들은 비교할 필요가 없기 때문에 answer를 리턴한다.

 

 

 

 

 

'Algorithm > JavaScript' 카테고리의 다른 글

[투포인터] 연속 부분수열 - (1)  (0) 2021.12.16
[프로그래머스] 문자열 압축  (0) 2021.12.16
[투포인터] 두 배열 합치기  (0) 2021.12.15
[완전탐색] K번째 큰 수  (0) 2021.12.13
[완전탐색] 졸업 선물  (0) 2021.12.13

댓글