algorithm

공통원소 구하기

juuuuuuun 2024. 5. 9. 17:53

설명

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

 

입력

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

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

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

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

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

 

출력

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

예시 입력 1 

5
1 3 9 5 2
5
3 2 5 7 8

 

예시 출력 1

2 3 5

 

소스 코드 1 (시간 제한 걸림,,)

import java.util.ArrayList;
import java.util.Scanner;
//공통원소 구하기 Time limit 걸림
public class Main {
    public static ArrayList<Integer> solution(int N, int M, int[] A, int[] B) {
        ArrayList<Integer> tmp = new ArrayList<>();
        ArrayList<Integer> ans = new ArrayList<>();

		//같은 원소만 추출해 tmp에 추가한다.
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                if (A[i] == B[j]) {
                    tmp.add(A[i]);
                    break;
                }
            }
        }

		//tmp(공통원소) 오름차순
        while (tmp.size() != 0) {
            int min = Integer.MAX_VALUE;

            for (int i = 0; i < tmp.size(); i++) {
                if (tmp.get(i) < min) { //tmp 원소에서 가장 작은 것 min에 저장
                    min = tmp.get(i);
                }
            }
            ans.add(min); //최소값 ans에 저장
            tmp.remove(tmp.indexOf(min)); //방금 뽑은 최솟값 tmp에서 제거
        }

        return ans;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int[] A = new int[N];
        for (int i = 0; i < N; i++) {
            A[i] = sc.nextInt();
        }
        int M = sc.nextInt();
        int[] B = new int[M];
        for (int i = 0; i < M; i++) {
            B[i] = sc.nextInt();
        }

        for (int s : solution(N, M, A, B)) {
            System.out.print(s + " ");
        }
    }
}

 

 

소스 코드 2

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

//공통원소 구하기
public class Main {
    public static ArrayList<Integer> solution(int N, int M, int[] A, int[] B) {
        ArrayList<Integer> ans = new ArrayList<>();
        int pA = 0, pB = 0; //A와 B 인덱스 값으로 사용할 변수
        //A, B 오름차순 정렬
        Arrays.sort(A);
        Arrays.sort(B);
        while (pA < N && pB < M) { //A,B 중 하나가 인덱스 끝을 볼 때 까지 반복
            if (A[pA] < B[pB]) { //A값이 작다면 인덱스 카운트
                pA++;
            } else if (A[pA] > B[pB]) { //B값이 작다면 인덱스 카운트
                pB++;
            } else { //A,B 원소가 같다면 ans에 추가후 A,B 모두 카운트
                ans.add(A[pA]);
                pA++;
                pB++;
            }
        }

        return ans;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int[] A = new int[N];
        for (int i = 0; i < N; i++) {
            A[i] = sc.nextInt();
        }
        int M = sc.nextInt();
        int[] B = new int[M];
        for (int i = 0; i < M; i++) {
            B[i] = sc.nextInt();
        }

        for (int s : solution(N, M, A, B)) {
            System.out.print(s + " ");
        }
    }
}

 

 

Arrays.sort()

 - 배열을 오름차순 해준다

 - A = {1,5,3,4,2} 였을 때 Arrays.sort(A)를 사용하면 A = {1,2,3,4,5}가 된다.