[Rust로 백준 하루 하나] 14-7. 대칭 차집합

김진산·2024년 10월 7일

Rust로 백준 하루 하나

목록 보기
117/138
post-thumbnail

문제 (1269번)

자연수를 원소로 갖는 공집합이 아닌 두 집합 A와 B가 있다. 이때, 두 집합의 대칭 차집합의 원소의 개수를 출력하는 프로그램을 작성하시오. 두 집합 A와 B가 있을 때, (A-B)와 (B-A)의 합집합을 A와 B의 대칭 차집합이라고 한다.

예를 들어, A = { 1, 2, 4 } 이고, B = { 2, 3, 4, 5, 6 } 라고 할 때,  A-B = { 1 } 이고, B-A = { 3, 5, 6 } 이므로, 대칭 차집합의 원소의 개수는 1 + 3 = 4개이다.

입력

첫째 줄에 집합 A의 원소의 개수와 집합 B의 원소의 개수가 빈 칸을 사이에 두고 주어진다. 둘째 줄에는 집합 A의 모든 원소가, 셋째 줄에는 집합 B의 모든 원소가 빈 칸을 사이에 두고 각각 주어진다. 각 집합의 원소의 개수는 200,000을 넘지 않으며, 모든 원소의 값은 100,000,000을 넘지 않는다.

출력

첫째 줄에 대칭 차집합의 원소의 개수를 출력한다.


풀이

코드

use std::io::{self, BufReader, BufRead, BufWriter, Write};
use std::collections::HashSet;

fn main() {
    let mut reader = BufReader::new(io::stdin().lock());
    let mut writer = BufWriter::new(io::stdout().lock());
    
    let mut line = String::new();
    reader.read_line(&mut line).unwrap();
    
    // 집합 A
    let mut input = String::new();
    input.clear();
    reader.read_line(&mut input).unwrap();
    let input_iter = input
        .trim()
        .split_whitespace()
        .map(|i| i.parse::<u32>().unwrap());
    let set_a: HashSet<u32> = HashSet::from_iter(input_iter);
    
    
    // 집합 B
    input.clear();
    reader.read_line(&mut input).unwrap();
    let input_iter = input
        .trim()
        .split_whitespace()
        .map(|i| i.parse::<u32>().unwrap());
    let set_b: HashSet<u32> = HashSet::from_iter(input_iter);
    
    let set_sym_diff: HashSet<_> = set_a.symmetric_difference(&set_b).collect();
    let output = set_sym_diff.len();
    
    writeln!(writer, "{}", output).unwrap();
    
}

해설

rust의 HashSet에는 대칭 차집합이 symmetric_difference 메서드로 이미 구현되어 있다.

pub fn symmetric_difference<'a>(
  &'a self,
  other: &'a HashSet<T, S>,
) -> SymmetricDifference<'a, T, S>

https://doc.rust-lang.org/std/collections/struct.HashSet.html#method.symmetric_difference

그 외에도 rust의 HashSet에는 차집합(difference), 합집합(union), 교집합(intersection) 등의 메서드가 구현되어 있으니 참고하자.


추가 학습

  • 특이사항 없음
profile
블록체인 개발자

0개의 댓글