λ°±μ€€

[Java] λ°±μ€€ 1822

λ‹€λΈ”πŸ’ 2022. 10. 2. 21:13

1822. μ°¨μ§‘ν•© (Silver 4) 

# 자료ꡬ쑰

λͺ‡ 개의 μžμ—°μˆ˜λ‘œ 이루어진 두 μ§‘ν•© A와 Bκ°€ μžˆλ‹€. μ§‘ν•© Aμ—λŠ” μ†ν•˜λ©΄μ„œ μ§‘ν•© Bμ—λŠ” μ†ν•˜μ§€ μ•ŠλŠ” λͺ¨λ“  μ›μ†Œλ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

μž…λ ₯

첫째 μ€„μ—λŠ” μ§‘ν•© A의 μ›μ†Œμ˜ 개수 n(A)와 μ§‘ν•© B의 μ›μ†Œμ˜ 개수 n(B)κ°€ 빈 칸을 사이에 두고 μ£Όμ–΄μ§„λ‹€. (1 ≤ n(A), n(B) ≤ 500,000)이 μ£Όμ–΄μ§„λ‹€. λ‘˜μ§Έ μ€„μ—λŠ” μ§‘ν•© A의 μ›μ†Œκ°€, μ…‹μ§Έ μ€„μ—λŠ” μ§‘ν•© B의 μ›μ†Œκ°€ 빈 칸을 사이에 두고 μ£Όμ–΄μ§„λ‹€. ν•˜λ‚˜μ˜ μ§‘ν•©μ˜ μ›μ†ŒλŠ” 2,147,483,647 μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ©°, ν•˜λ‚˜μ˜ 집합에 μ†ν•˜λŠ” λͺ¨λ“  μ›μ†Œμ˜ 값은 λ‹€λ₯΄λ‹€.

 

좜λ ₯

첫째 쀄에 μ§‘ν•© Aμ—λŠ” μ†ν•˜λ©΄μ„œ μ§‘ν•© Bμ—λŠ” μ†ν•˜μ§€ μ•ŠλŠ” μ›μ†Œμ˜ 개수λ₯Ό 좜λ ₯ν•œλ‹€. λ‹€μŒ μ€„μ—λŠ” ꡬ체적인 μ›μ†Œλ₯Ό 빈 칸을 사이에 두고 μ¦κ°€ν•˜λŠ” μˆœμ„œλ‘œ 좜λ ₯ν•œλ‹€. μ§‘ν•© Aμ—λŠ” μ†ν•˜λ©΄μ„œ μ§‘ν•© Bμ—λŠ” μ†ν•˜μ§€ μ•ŠλŠ” μ›μ†Œκ°€ μ—†λ‹€λ©΄ 첫째 쀄에 0λ§Œμ„ 좜λ ₯ν•˜λ©΄ λœλ‹€.

 

예제 μž…λ ₯ 1

4 3
2 5 11 7
9 7 4

예제 좜λ ₯ 1

3
2 5 11

 

예제 μž…λ ₯ 2

3 5
2 5 4
1 2 3 4 5

예제 좜λ ₯ 2

0

 

문제λ₯Ό ν’€κΈ° μœ„ν•΄ μžλ™μœΌλ‘œ μ˜€λ¦„μ°¨μˆœ 정렬을 ν•΄μ£ΌλŠ” 동적 배열인 TreeSet을 μ‚¬μš©ν•΄μ€¬λ‹€.

κ·Έ λ‹€μŒ μ§‘ν•© a의 μ›μ†Œ κ°œμˆ˜μ™€ μ§‘ν•© b의 μ›μ†Œ 개수λ₯Ό μ°¨λ‘€λ‘œ μž…λ ₯ λ°›κ³ , μž…λ ₯받은 μ§‘ν•© a의 μ›μ†Œ 개수만큼 a의 μ›μ†Œλ₯Ό d_set에 λ‹΄μ•˜λ‹€.

μ§‘ν•© b의 μ›μ†Œ 개수만큼 ν•΄λ‹Ή μ›μ†Œλ₯Ό μž…λ ₯λ°›μ•˜λŠ”λ°, ifλ¬Έκ³Ό containsλ₯Ό μ‚¬μš©ν•΄μ„œ λ§Œμ•½ aμ§‘ν•©μ—μ„œ μž…λ ₯받은 μ›μ†Œμ™€ μ€‘λ³΅λ˜λŠ” 것이 μžˆλ‹€λ©΄ ν•΄λ‹Ή μ›μ†Œλ₯Ό removeλ₯Ό μ‚¬μš©ν•΄μ„œ μ‚­μ œν•΄μ€¬λ‹€.

λ§ˆμ§€λ§‰μœΌλ‘œ λ°°μ—΄μ˜ 크기λ₯Ό sizeλ₯Ό μ‚¬μš©ν•΄μ„œ 좜λ ₯ν•΄μ£Όμ—ˆκ³ , d_set에 μžˆλŠ” μ›μ†Œλ“€μ„ 좜λ ₯ν•΄μ£Όμ—ˆλ‹€.

import java.util.Scanner;
import java.util.TreeSet;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num_a, num_b;
        int overlap;
        TreeSet<Integer> d_set = new TreeSet<Integer>();

        num_a = sc.nextInt();    // μ§‘ν•© a μ›μ†Œ 개수
        num_b = sc.nextInt();    // μ§‘ν•© b μ›μ†Œ 개수

        for (int i = 0; i < num_a; i++) 
            d_set.add(sc.nextInt());    // a μ›μ†Œ d_set 배열에 λ‹΄κΈ°
        
        for (int j = 0; j < num_b; j++) {
            overlap = sc.nextInt();   // μ›μ†Œ b에 λ‹΄κΈΈ μ›μ†Œ μž…λ ₯ λ°›μŒ
            if (d_set.contains(overlap)) {    // λ§Œμ•½ a μ§‘ν•©κ³Ό μ€‘λ³΅λ˜λŠ” 게 있으면 
                d_set.remove(overlap);        // ν•΄λ‹Ή μ›μ†Œ μ‚­μ œ
            }
        }
        System.out.println(d_set.size()); // λ°°μ—΄(μ°¨μ§‘ν•©)의 크기 좜λ ₯

        for (Integer n : d_set) {
            System.out.print(n + " ");
        }
    }
}

μžλ°”λ‘œ λ°±μ€€ λ¬Έμ œλŠ” 처음 μ œμΆœν•΄λ΄μ„œ class이름을 Main으둜 ν•˜λŠ” κ±Έ λͺ°λžλ˜μ§€λΌ μ—„μ²­ 많이 μ»΄νŒŒμΌμ—λŸ¬κ°€ 났닀.......