Skip to content

Commit c38438b

Browse files
committed
[BOJ]18428_감시피하기 / Gold / 실패
https://www.acmicpc.net/problem/18428
1 parent 81d283d commit c38438b

File tree

1 file changed

+75
-0
lines changed

1 file changed

+75
-0
lines changed

Hongjoo/백준/감시피하기.py

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
"""
2+
role : 1. T , S , O
3+
T - 상하좌우 like 룩
4+
- 장애물 막히면 뒤에 못봄
5+
6+
1. T 가 볼 수 있는 영역 -> S 탐색 여부 확인
7+
2.
8+
9+
10+
"""
11+
import sys
12+
def backtracking(cnt):
13+
global flag
14+
15+
# 3개 장애믈 설치 끝나면
16+
if cnt == 3 :
17+
# 선생님들 위치에서 감시
18+
if check_S():
19+
flag = True # 성공하면 flag를 True로 초기화
20+
return True
21+
else : # 모든 빈 공간에 장애물 3개씩 설치해보기
22+
for x in range(n):
23+
for y in range(n) :
24+
if graph[x][y] == "X":
25+
graph[x][y] = "O"
26+
backtracking(cnt+1) # backtraking
27+
graph[x][y] = "X"
28+
29+
30+
def check_S() :
31+
#check_S : 선생님 시야 함수 (bfs -> 근데 dfs에 가깝지 않나???)
32+
#check = True # T가 S 를 못 찾음
33+
34+
# 상하좌우 움직이는 배열
35+
dx = [1,-1,0,0]
36+
dy = [0,0,1,-1]
37+
38+
for t in teachers : # 선생님 위치에서
39+
40+
for k in range(4): #상하좌우 탐색
41+
nx = t[0] + dx[k]
42+
ny = t[1] + dy[k]
43+
# 선생님 x,y 좌표
44+
while 0 <= nx < n and 0 <= ny < n : # graph 범위 밖 넘어가는 것 차단
45+
if graph[nx][ny] == "O" : #방애물 있으면 해당 방향 스킵
46+
break
47+
if graph[nx][ny] == "S" : # S 가 있으면 실패
48+
return False
49+
nx += dx[k]
50+
ny += dy[k]
51+
52+
# 모두 통과하면 S가 안보이는 것으로 성공
53+
return True
54+
55+
56+
# input 받기 - graph , T 위치 , X 위치
57+
n = int(sys.stdin.readline())
58+
flag = False # (답) 전체 시야 차단 yes or no
59+
graph = [] # 전체 MAP 위치
60+
teachers = list () # 선생님 (T) 좌표
61+
62+
for i in range(n):
63+
graph.append(list(map(str , sys.stdin.readline().split())))
64+
for j in range(n):
65+
if graph[i][j] == "T": # 선생님 있는 좌표 저장
66+
teachers.append([i,j])
67+
68+
69+
# BFS
70+
backtracking(0)
71+
72+
if flag :
73+
print("YES")
74+
else :
75+
print("NO")

0 commit comments

Comments
 (0)