자바스크립트 알고리즘 문제풀이 강의를 듣고 정리한 내용입니다.
📋 문제
두 개의 배열이 주어지면 주어진 배열들의 공통 원소를 추출하여 오름차순으로 출력한다.
👉 입력
첫 번째 줄에 첫 번째 배열의 크기 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 |
댓글