최대 1 분 소요

[백준 1269번] 대칭 차집합

Arrays.asList(배열)

.contains() 를 사용하기 위해서는 ArrayList로 배열을 변경시켜줘야되었다. 그래서 발견한 매서드 asList. 얘는 java.util.Arrays에서의 매서드로, ArraysList와의 차이점은 add() 매소드가 없다는 것이다. 즉 추가, 제거가 불가능하다는 말이다. 아직도 Arrays와 ArrayList의 정확한 차이는 모르지만 일단 Arrays를 asList 매서드를 통해서 ArrayList 형태로 바꿀 수 있다.

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package _2월_1주차;
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.List;
import java.util.StringTokenizer;
 
public class 백준_손수경_정답_1269 {
    
    public static void main(String[] args) throws IOException {
        
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;
        st = new StringTokenizer(br.readLine());
        int cntSetA = Integer.parseInt(st.nextToken());
        int cntSetB = Integer.parseInt(st.nextToken());
        String[] setA = new String[cntSetA];
        String[] setB = new String[cntSetB];
        st = new StringTokenizer(br.readLine());
        int cnt = 0;
        for (int i = 0; i < cntSetA; i++) {
            setA[i] = st.nextToken();
        }
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i< cntSetB; i++) {
            setB[i] = st.nextToken();
        }
        List<String> listA = Arrays.asList(setA);
        List<String> listB = Arrays.asList(setB);
        for (String i : listA) {
            boolean isSame = listB.contains(i);
            if (isSame == false) {
                cnt++;
            }
        }
        for (String i : listB) {
            boolean isSame = listA.contains(i);
            if (isSame == false) {
                cnt++;
            }
        }
        
        bw.write(cnt + "\n");
        bw.close();
    }
 
}
 
cs


Arrays -> ArrayList로 바꾼 다음 .contains() 매서드를 사용해서 같은 것이 포함되어있는지 아닌지를 비교했다. -> 시간 초과 발생,,,,

ArrayList setA = new ArrayList() 사용

앞의 풀이에서 배열을 ArrayList로 바꾸고 나머지는 같음. 여기서 ArrayList같은 경우는 요소를 추가하기 위해서는 대입 연산자를 사용하는 것이 아닌 .add() 매서드를 사용해야 된다.

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package _2월_1주차;
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.StringTokenizer;
 
public class 백준_손수경_정답_1269 {
    
    public static void main(String[] args) throws IOException {
        
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;
        st = new StringTokenizer(br.readLine());
        int cntSetA = Integer.parseInt(st.nextToken());
        int cntSetB = Integer.parseInt(st.nextToken());
        ArrayList<Integer> setA = new ArrayList(); //ArrayList 생성
        ArrayList<Integer> setB = new ArrayList();
        int cnt = 0
        
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < cntSetA; i++) {
            setA.add(Integer.parseInt(st.nextToken()));
        }
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < cntSetB; i++) {
            setB.add(Integer.parseInt(st.nextToken()));
        }
        
        for (int i : setA) {
            boolean isSame = setB.contains(i);
            if (isSame == false) {
                cnt++;
            }
        }
        for (int i : setB) {
            boolean isSame = setA.contains(i);
            if (isSame == false) {
                cnt++;
            }
        }
        bw.write(cnt + "\n");
        bw.close();
    }
 
}
 
cs

그럼에도 불구하고,,,시간 초과,,,

Set setA = new HashSet<> ()

그래서 결국 구글링을 해봤더니, 배열과 리스트 보다 Hash가 검색 속도가 짧다는 것이었다. 그래서 위의 코드에서 ArrayList를 Set으로만 변경하였더니 정답이 나왔다. …..하,, 오래 걸렸다,,,,,ㅎ

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package _2월_1주차;
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;
 
public class 백준_손수경_정답_1269 {
    
    public static void main(String[] args) throws IOException {
        
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;
        st = new StringTokenizer(br.readLine());
        int cntSetA = Integer.parseInt(st.nextToken());
        int cntSetB = Integer.parseInt(st.nextToken());
        Set<Integer> setA = new HashSet(); //ArrayList 생성
        Set<Integer> setB = new HashSet();
        int cnt = 0
        
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < cntSetA; i++) {
            setA.add(Integer.parseInt(st.nextToken()));
        }
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < cntSetB; i++) {
            setB.add(Integer.parseInt(st.nextToken()));
        }
        
        for (int i : setA) {
            boolean isSame = setB.contains(i);
            if (isSame == false) {
                cnt++;
            }
        }
        for (int i : setB) {
            boolean isSame = setA.contains(i);
            if (isSame == false) {
                cnt++;
            }
        }
        bw.write(cnt + "\n");
        bw.close();
    }
 
}
 
cs


배운 점

뭔가를 찾거나 비교를 하려면은 ArrayList보다는 Hash가 낫다.

댓글남기기