Skip to content

Commit 9aef3af

Browse files
authored
감시피하기 o, 인구이동 x (#88)
1 parent 3d112cc commit 9aef3af

File tree

2 files changed

+141
-0
lines changed

2 files changed

+141
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
n = int(input())
2+
3+
arr = []
4+
temp = [[0] * n for _ in range(n)]
5+
teacher = []
6+
find = 0
7+
for i in range(n):
8+
arr.append(list(map(str, input().split())))
9+
for j in range(n):
10+
if arr[i][j] == 'T':
11+
teacher.append((i, j))
12+
13+
14+
def dfs(count):
15+
global find
16+
if count == 3: # 장애물 3개가 다 설치된 경우
17+
for i in range(n): # 장애물 설치된 맵을 복사한 후에
18+
for j in range(n):
19+
temp[i][j] = arr[i][j]
20+
21+
if not check(): # 감시를 피하면 YES 출력후 종료
22+
print("YES")
23+
quit()
24+
25+
else: # 감시 못피하면 다른 경우도 검사해보기
26+
return
27+
28+
for i in range(n): # 빈 공간에 대해서 장애물 3개까지 설치해보는 과정
29+
for j in range(n):
30+
if arr[i][j] == 'X':
31+
arr[i][j] = 'O' # 알파벳 O임
32+
count += 1
33+
dfs(count)
34+
count -= 1
35+
arr[i][j] = 'X'
36+
37+
38+
def check():
39+
result = 0
40+
for x, y in teacher:
41+
for i in range(4): # 상하좌우 방향 검사
42+
if see(x, y, i): # 학생의 위치를 파악한 경우
43+
return True
44+
45+
return False # 학생의 위치를 파악하지 못한 경우
46+
47+
48+
def see(x, y, dir): # 상하좌우 순으로 검사
49+
if dir == 0:
50+
while 0 <= x < n:
51+
if temp[x][y] == 'S':
52+
return True
53+
if temp[x][y] == 'O':
54+
return False
55+
else:
56+
x -= 1
57+
if dir == 1:
58+
while 0 <= x < n:
59+
if temp[x][y] == 'S':
60+
return True
61+
if temp[x][y] == 'O':
62+
return False
63+
else:
64+
x += 1
65+
if dir == 2:
66+
while 0 <= y < n:
67+
if temp[x][y] == 'S':
68+
return True
69+
if temp[x][y] == 'O':
70+
return False
71+
else:
72+
y -= 1
73+
if dir == 3:
74+
while 0 <= y < n:
75+
if temp[x][y] == 'S':
76+
return True
77+
if temp[x][y] == 'O':
78+
return False
79+
else:
80+
y += 1
81+
82+
return False
83+
84+
85+
dfs(0)#dfs 함수안에서 한번만이라도 감시를 피했으면 YES 출력후 종료함
86+
print("NO")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
from collections import deque
2+
3+
n, l, r = map(int, input().split())
4+
5+
arr = []
6+
for _ in range(n):
7+
arr.append(list(map(int, input().split())))
8+
9+
10+
#bfs, visited 사용해서 연합의 위치를 큐에 넣어주기
11+
#1. bfs로 일단 먼저 연합끼리 큐에 넣고 (이때 큐에 넣을수 있으면 True, 못 넣으면 False)
12+
#2. 큐에 넣은 연합애들끼리 통일시킨다
13+
#3. 그 다음 또 bfs를 돌릴수 있는지 없는지 판단하기, bfs를 몇번 돌릴 수 있냐를 물어보는 문제
14+
15+
dx = [-1, 1, 0, 0]
16+
dy = [0, 0, -1, 1]
17+
18+
visited = [[0] * n for _ in range(n)]
19+
union = [[-1] * n for _ in range(n)]
20+
count = 0
21+
22+
def bfs(x, y, index): #x, y로 주어진 나라 위치 기준으로 연합국을 찾아 나가는 과정
23+
for i in range(4):
24+
nx = x + dx[i]
25+
ny = y + dy[i]
26+
if 0 <= nx < n and 0 <= ny < n and not visited[nx][ny]: #bfs 조건
27+
if l <= abs(arr[x][y]-arr[nx][ny]) <= r: #두 나라 사이의 인구수차이가 조건을 만족할때
28+
union[nx][ny] = index
29+
visited[nx][ny] = 1
30+
bfs(nx, ny, index)
31+
return
32+
33+
34+
for i in range(n): #모든 나라에 대해서 연합 index를 union배열에 초기화 시켜주기
35+
for j in range(n):
36+
if not visited[i][j]:
37+
#q = deque((i, j, count)) #bfs 돌릴 초기값 설정
38+
visited[i][j] = 1
39+
union[i][j] = count #bfs 시작위치의 연합 index 설정
40+
bfs(i, j, count)
41+
42+
count += 1
43+
44+
for i in range(count):
45+
46+
47+
48+
49+
50+
51+
52+
53+
54+
55+

0 commit comments

Comments
 (0)