본문 바로가기

Algorithm

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
import java.util.*;
class Solution {
    static Set<Integer> set = new HashSet<Integer>();
    
    public void DFS(ArrayList<String> list, ArrayList<String> res, int i, int n) {
        // 마지막 배열을 입력했을 때
        if (i == 0) {
            return;
        }
 
        // 모든 경우의 수를 구하여 set에 저장
        for (int j = 0; j < n; j++) {
            res.add(list.remove(j));
            String[] s = res.toArray(new String[res.size()]);
            set.add(Integer.parseInt(String.join("", s)));
            DFS(list, res, i - 1, n - 1);
            list.add(j, res.remove(res.size() - 1));
        }
    }
    
    public int solution(String numbers) {
        int answer = 0;
        String[] arr = numbers.split(""); // 숫자 분할
        ArrayList<String> list = new ArrayList<String>(Arrays.asList(arr));
        ArrayList<String> res = new ArrayList<String>();
        DFS(list, res, list.size(), list.size());
 
        // 소수 구하기
        Iterator<Integer> iterSet = set.iterator();
        while (iterSet.hasNext()) {
            int i;
            int n = iterSet.next();
            int sqrt = (int) Math.sqrt(n);
 
            if (n > 1) {
                for (i = 2; i <= sqrt; i++) {
                    if (n % i == 0)
                        break;
                }
                if (i == sqrt + 1) {
                    answer++;
                }
            }
        }
        
        return answer;
    }
}
 
cs

 

문제 풀이 게시글만 있어서 따로 게시판에 작성함.

 

++ 추가

문제를 풀다가 res를 가공한 값이 아닌, res 자체를 직접 전역 변수에 추가를 했을 때 문제가 생기는 것을 발견하였다.

res는 재귀함수를 수행하면서 요소가 추가되고 삭제되는데 이 때문에 함수가 종료되고 전역 변수에는 빈 값만 남아있게 된다.

1
2
3
4
5
6
7
8
9
10
11
12
    private static ArrayList<ArrayList<Integer>> allList = new ArrayList<ArrayList<Integer>>();
    public static void setAllList(ArrayList<Integer> list, ArrayList<Integer> res, int n) {
        if(n==0) {
            allList.add(res);
            return;
        }
        for (int k = 0; k < n; k++) {
            res.add(list.remove(k));
            setAllList(list, res, n - 1);
            list.add(k, res.remove(res.size() - 1));
        }
    }
cs

이 경우에는 allList에 res를 직접 넣고 있는데, 함수가 종료되면 allList에는 [[], [], [], [], [], []] 같은 빈 리스트만 존재하게 된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
    private static ArrayList<ArrayList<Integer>> allList = new ArrayList<ArrayList<Integer>>();
    public static void setAllList(ArrayList<Integer> list, ArrayList<Integer> res, int n) {
        if(n==0) {
            allList.add(new ArrayList<Integer>(res));
            return;
        }
        for (int k = 0; k < n; k++) {
            res.add(list.remove(k));
            setAllList(list, res, n - 1);
            list.add(k, res.remove(res.size() - 1));
        }
    }
cs

이를 해결하기 위해서 res의 값은 가지면서 별개의 객체가 필요하다.

new ArrayList로 새로 생성한 res 값을 가진 리스트를 넣어주면 함수가 종료된 후에도 정상적인 값을 가지게 된다.

 

단체사진 찾기 게시글 : https://zzunsik.tistory.com/118

소수 찾기 게시글 : https://zzunsik.tistory.com/119

 

'Algorithm' 카테고리의 다른 글

네트워크 플로우(Network Flow) 및 이분 매칭(Bipartite Matching)  (0) 2022.03.07
Merge Sort  (0) 2022.02.20
멱집합  (0) 2021.07.25
최대합 부분배열  (0) 2020.04.25
소수 판별 알고리즘  (2) 2020.04.18