[백준 1269번] 대칭 차집합
[백준 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가 낫다.
댓글남기기