Post

[인프런] 공통원소 구하기

[인프런] 공통원소 구하기

난이도

  • Easy

문제 설명

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

입력 형식

  • 첫 번째 줄에 집합 A의 크기 N(1<=N<=30,000)이 주어집니다.
  • 두 번째 줄에 N개의 원소가 주어집니다. 원소가 중복되어 주어지지 않습니다.
  • 세 번째 줄에 집합 B의 크기 M(1<=M<=30,000)이 주어집니다.
  • 네 번째 줄에 M개의 원소가 주어집니다. 원소가 중복되어 주어지지 않습니다.

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

출력 형식

  • 문자열

예제 입력 및 출력

1
2
3
4
5
6
7
8
**예제 1:**
입력: 
5
1 3 9 5 2
5
3 2 5 7 8
출력: 2,3,5

접근 방법

  • 순회와 set을 이용해 동일한 값만 결과값에 담아 출력

시간 및 공간 복잡도

  • 시간 복잡도 : O(NlogN)
    • 입력 받은 원소들을 HashSet에 저장: O(N) + O(M)
    • HashSet의 contains 연산: O(1)
    • 결과 리스트 정렬: O(KlogK) (K는 공통 원소의 개수로, 최대 min(N,M))
    • 따라서 전체 시간 복잡도는 정렬이 지배적이므로 O(NlogN)
  • 공간 복잡도: O(N + M)
    • 첫 번째 집합을 저장하는 HashSet: O(N)
    • 두 번째 집합을 저장하는 HashSet: O(M)
    • 결과를 저장하는 ArrayList: O(min(N,M))
    • 따라서 전체 공간 복잡도는 O(N + M)

코드 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class App {
    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        Set<Integer> set1 = new HashSet<>();
        for (int i = 0; i < n; i++) {
            set1.add(sc.nextInt());
        }

        int k = sc.nextInt();

        List<Integer> answer = new ArrayList<>();

        Set<Integer> set2 = new HashSet<>();
        for (int i = 0; i < k; i++) {
            set2.add(sc.nextInt());
        }
        for (int num : set2) {
            if (set1.contains(num)) {
                answer.add(num);
            }
        }

        Collections.sort(answer);
        for (int num1 : answer) {
            System.out.print(num1 + " ");
        }
    }
}

This post is licensed under CC BY 4.0 by the author.