본문 바로가기

Programmers/Level3

외벽 점검

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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import java.util.*;
class Solution {
    static ArrayList<ArrayList<Integer>> orders = new ArrayList<ArrayList<Integer>>();
    static ArrayList<ArrayList<Integer>> weak_orders = new ArrayList<ArrayList<Integer>>();
 
    static void setOrder(ArrayList<Integer> all_dist, ArrayList<Integer> res) {
        for(int i=0;i<all_dist.size();i++) {
            res.add(all_dist.remove(i));
            orders.add(new ArrayList(res));
            setOrder(all_dist, res);
            all_dist.add(i, res.remove(res.size() - 1));
        }
    }
    static boolean checkOrder(int n, int[] weak, int[] dist, ArrayList<Integer> order, ArrayList<Integer> weak_order) {
        boolean[] visited = new boolean[n];
        int cnt = 0;
        int pos = 0;
        for (int i = 0; i < weak_order.size(); i++) {
            if (pos >= order.size())
                break;
            if (visited[weak_order.get(i)])
                continue;
 
            // 방문 체크
            for (int j = weak_order.get(i); j <= weak_order.get(i) + order.get(pos); j++) {
                if (j >= n)
                    visited[j - n] = true;
                else
                    visited[j] = true;
            }
            pos++;
        }
 
        for (int i = 0; i < weak.length; i++) {
            if (visited[weak[i]])
                cnt++;
        }
        if (cnt == weak.length)
            return true;
        else
            return false;
    }
 
    public int solution(int n, int[] weak, int[] dist) {
        int answer = 0;
        ArrayList<Integer> all_dist = new ArrayList<Integer>();
        for(int i=0;i<dist.length;i++)
            all_dist.add(dist[i]);
 
        // 친구를 보내는 방법 초기화
        setOrder(all_dist, new ArrayList<Integer>());
 
        // 친구 수 오름차순으로 정렬
        Collections.sort(orders, new Comparator<ArrayList<Integer>>() {
            @Override
            public int compare(ArrayList<Integer> o1, ArrayList<Integer> o2) {
                return o1.size() - o2.size();
            }
        });
 
        // 방문 순서 초기화
        for(int i=0;i<weak.length;i++) {
            ArrayList<Integer> weak_order = new ArrayList<Integer>();
            for(int j=i;j<weak.length;j++) {
                weak_order.add(weak[j]);
            }
            for(int j=0;j<i;j++) {
                weak_order.add(weak[j]);
            }
            weak_orders.add(weak_order);
        }
 
        for (int i = 0; i < orders.size(); i++) {
            for (int j = 0; j < weak_orders.size(); j++) {
                // 성공했을 경우 해당 인원을 반환
                if (checkOrder(n, weak, dist, orders.get(i), weak_orders.get(j))) {
                    return orders.get(i).size();
                }
            }
        }
        return -1;
    }
}
cs

외벽 방문 방법과 친구를 고르는 방법을 모두 고려하여 탐색하였다.

'Programmers > Level3' 카테고리의 다른 글

있었는데요 없었습니다  (0) 2021.12.23
줄 서는 방법  (0) 2021.11.27
야근 지수  (0) 2021.11.24
합승 택시 요금  (0) 2021.11.10
N-Queen  (0) 2021.11.03