3-2 공통원소 구하기 (Java)

정우·2022년 10월 8일

✏️ 문제


설명

A, B 두 개의 집합이 주어지면 두 집합의 공통 원소를 추출하여 오름차순으로 출력하는 프로그램을 작성하세요.

입력

첫 번째 줄에 집합 A의 크기 N(1<=N<=30,000)이 주어집니다.

두 번째 줄에 N개의 원소가 주어집니다. 원소가 중복되어 주어지지 않습니다.

세 번째 줄에 집합 B의 크기 M(1<=M<=30,000)이 주어집니다.

네 번째 줄에 M개의 원소가 주어집니다. 원소가 중복되어 주어지지 않습니다.

각 집합의 원소는 1,000,000,000이하의 자연수입니다.

출력

두 집합의 공통원소를 오름차순 정렬하여 출력합니다.

예제입력
5
1 3 9 5 2
5
3 2 5 7 8

예제출력
2 3 5


✏️ 코드


import java.util.Scanner;
import java.util.ArrayList;
import java.util.Arrays;

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] arr = new int[n];
        for (int i=0; i<n; i++) {
            arr[i] = sc.nextInt();
        }
        int m = sc.nextInt();
        int[] arr1 = new int[m];
        for (int i=0; i<m; i++) {
            arr1[i] = sc.nextInt();
        }
        sc.close();

        for (int i : solution(n, m, arr, arr1)) {
            System.out.print(i + " ");
        }
    }

    public static ArrayList<Integer> solution(int n, int m, int[] arr, int[] arr1) {
        ArrayList<Integer> answer = new ArrayList<Integer>();
        Arrays.sort(arr);
        Arrays.sort(arr1);
        int p1 = 0, p2 = 0;

        while (p1<n && p2<m) {
            if (arr[p1] == arr1[p2]) {
                answer.add(arr[p1]);
                p1++;
                p2++;
            }
            else if (arr[p1] < arr1[p2]) {
                p1++;
            }
            else {
                p2++;
            }
        }

        return answer;
    }
}

투포인터 알고리즘을 사용해서 풀었다
해당 알고리즘을 사용하기 위해서 우선 배열은 정렬이 되어있어야하기 때문에 arr, arr1을 각각 정렬부터 해주었다.

p1, p2 변수를 만들어 0으로 초기화하고 배열을 순회하며 p1,p2가 같을 떄 answer에 추가해주었다.

각 배열은 정렬이 되어있기 떄문에 arr[p1]arr1[p2]보다 작으면 arr배열에는 그 전까지 해당 공통원소가 없기때문에 p1++을 해주는 것이고 반대인 경우에는 p2++를 해주면 된다.

이중 for문을 통해서 문제를 풀 수 있지만 N의 크기가 커지면 시간 복잡도가 그만큼 엄ㅊ어 늘어나서 풀 수 없기 때문에 투포인터 알고리즘을 통해서 풀면 된다.


정리

투포인터 알고리즘 설명

profile
That's it

0개의 댓글