## 접근
1. 시작점을 잡고, 순열을 통해서 모든 외벽의 취약 지점들을 커버할 수 있는지 확인해야 한다. 함수는 필요한 인원수를 반환하는 것으로 정의한다.
2. 외벽은 원의 형태를 이루고 있으므로, 이동할 수 있는 거리는 시계 방향만 고려하면 된다.(반시계로 된다면 시계로도 가능) 이동할 수 있는 거리가, 외벽의 길이를 넘어가면 검사해야 하는 외벽들의 위치에 외벽의 길이만큼 더해줘야 한다.
## 해설코드
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
|
class Solution {
int[] w;
int[] d;
int N;
boolean[] distChk;
public int func(int weakIdx, int startIdx){
int result = 987654321;
for(int i = 0; i < d.length; i++){
if(distChk[i] == false){
distChk[i] = true;
int end = w[weakIdx] + d[i];
int idx = (weakIdx + 1) % w.length;
while(true){
int tmp = 0;
if(idx < startIdx) tmp = N;
if(w[idx] + tmp <= end){
idx = (++idx) % w.length;
if(idx == startIdx)
break;
}else
break;
}
if(idx == startIdx)
result = Math.min(result, 1);
else
result = Math.min(result, 1 + func(idx, startIdx));
distChk[i] = false;
}
}
return result;
}
public int solution(int n, int[] weak, int[] dist) {
int answer = 987654321;
N = n;
w = new int[weak.length];
w = weak;
d = new int[dist.length];
d = dist;
distChk = new boolean[dist.length];
for(int i = 0; i < weak.length; i++)
answer = Math.min(answer, func(i, i));
if(answer == 987654321) answer = -1;
return answer;
}
}
|
'알고리즘' 카테고리의 다른 글
[2019 KAKAO BLIND RECRUITMENT] 매칭 점수(C++) (0) | 2020.01.10 |
---|---|
[2019 KAKAO BLIND RECRUITMENT] 무지의 먹방 라이브(시행착오 포함) (0) | 2020.01.01 |
[2019 KAKAO BLIND RECRUITMENT] 후보키 (0) | 2019.12.30 |
[2020 KAKAO BLIND RECRUITMENT] 블록 이동하기(Java, 간단한 코드, DFS? or BFS?) (2) | 2019.12.26 |
[삼성 코딩 테스트] 코딩테스트 잘보는법, 자주 실수하는 유형(C++) (0) | 2019.10.20 |