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 |