Problem : 감시
유형 : DFS, 구현
문제, 예제 입출력 설명
해결 전략
cctv가 있는 위치를 스택에 보관 한다.
cctv가 감시하고 있는 부분을, 해당 cctv가 감시하고 있다고 표시해둔다.
만약 모든 cctv를 확인했다면, 전체 사각지대에서 현재까지 감시한 장소를 빼서 비교해본다.
구현에서 팁이 있다면
- cctv별로 관찰이 가능한 경우의 개수를
table
로 만들어서 관리하면 시간을 줄일 수 있다.- cctv는 통과가 가능하므로
- 사각지대 위치마다 감시하고 있는 cctv를 기록 해두면,
- 다른 cctv에서 탐색시 사각지대 인곳만 확인하면 된다.
주의할 점
- cctv 가 있는곳도 감시 하고 있는곳이다.
풀이
초기 정보를 입력받는다.
- cctv의 위치를 스택에 넣어둔다.
-
사각지대의 개수를 세본다.
int dir_size[] = { -1,4,2,4,4,1 };
- 각 cctv별로 관찰가능한 경우의 개수를
dir_size
에 만들어 둔다.
- 각 cctv별로 관찰가능한 경우의 개수를
Dfs를 한다.
- 스택이 비어있다면, 모든 cctv를 접근해본 것이다.
전체 사각지대 - 감시 하고 있는 사각지대
로 답과 비교해본다.
- 새로운 board 를 만들어 사용할 것이므로, 기존 board를
save_board
에 백업해둔다. - 해당 cctv가 몇번 유형의 cctv인지 확인한다.
- cctv 유형에 맞춰서,
watch
를 통해 구역을 확인한다.
- cctv 유형에 맞춰서,
감시 구역을 확인한다.
- 보고 있는 방향으로, 중간에 벽
6
이 등장하기 전까지 탐색한다.- 해당 구역를 다른 cctv가 감시를 하고 있다면, 그냥 넘어간다.
겹치는 부분
- 사각지대라면, 해당 위치에 현재 cctv의 유형이 감시하고 있다고 표시한다.
- 감시하고 있는 사각지대의 개수를 증가시킨다.
- 해당 구역를 다른 cctv가 감시를 하고 있다면, 그냥 넘어간다.
코드
1 |
|
피드백
양방향 이상의 경우, 2개 이상의 방향을 어떻게 탐색할까에 대해서 고민을 했다.
그냥 방향의 개수만큼 반복문을 돌리면 되는 부분 이었다.
스택이 비지 않았으면 해당 위치에서 가능한 경우의 수만큼 탐색할 뿐이다.
dfs 함수가 끝날때, 스택의 상태여부는 고려할 필요가 없다. 구현하다가 여기서 설계부분이 얽혀서 시간을 소모했다.
감시한 구역의 수를 세지않고, 마지막에 0인 구역만 세보는 방식과 속도가 똑같다. 4ms
코드
0ms는 어떻게 나오는 걸까 궁금하다.