‡ CODING TEST STUDY ‡/º 백준

[백준 | Java Silver IV] (#1269) 대칭 차집합

Trudy | 송연 2024. 7. 4. 14:04

문제

https://www.acmicpc.net/problem/1269


첫번째 제출 - 실패 (시간 초과)

가장 먼저 머릿속에 들었던 직관적인 방법으로 풀었더니 시간 초과..

package week9.baek.july7;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;

public class S1269 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String input = br.readLine();
        int a = Integer.parseInt(input.split(" ")[0]);
        int b = Integer.parseInt(input.split(" ")[1]);

        Set<String> A = new HashSet<String>();
        input = br.readLine();
        for (int i = 0; i < a; i++) {
            A.add(input.split(" ")[i]);
        }

        Set<String> B = new HashSet<String>();
        input = br.readLine();
        for (int i = 0; i < b; i++) {
            B.add(input.split(" ")[i]);
        }


        //A-B
        Set<String> A2 = new HashSet<>(A);
        for (String s: B) {
            if(A2.contains(s))  A2.remove(s);
        }

        //B-A
        Set<String> B2 = new HashSet<>(B);
        for (String s: A) {
            if(B2.contains(s)) B2.remove(s);
        }

        //대칭 차집합
        System.out.println(A2.size() + B2.size());
    }
}

 

최종 코드 

BufferedReader를 사용해서 input을 받고 split 함수를 통해 파싱을 했었는데 이것을 좀 더 빠른 StringTokenizer로 변경했더니 맞았다! 

package week9.baek.july7;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;

public class S1269 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int a = Integer.parseInt(st.nextToken());
        int b = Integer.parseInt(st.nextToken());

        Set<String> A = new HashSet<String>();
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < a; i++) {
            A.add(st.nextToken());
        }

        Set<String> B = new HashSet<String>();
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < b; i++) {
            B.add(st.nextToken());
        }


        //A-B
        Set<String> A2 = new HashSet<>(A);
        for (String s: B) {
            if(A2.contains(s))  A2.remove(s);
        }

        //B-A
        Set<String> B2 = new HashSet<>(B);
        for (String s: A) {
            if(B2.contains(s)) B2.remove(s);
        }

        //대칭 차집합
        System.out.println(A2.size() + B2.size());
    }
}