728x90
반응형
https://www.acmicpc.net/problem/18428
18428번: 감시 피하기
NxN 크기의 복도가 있다. 복도는 1x1 크기의 칸으로 나누어지며, 특정한 위치에는 선생님, 학생, 혹은 장애물이 위치할 수 있다. 현재 몇 명의 학생들은 수업시간에 몰래 복도로 빠져나왔는데, 복
www.acmicpc.net
문제 해결
벽 3개를 세우는 경우의 수를 모두 해보는 수밖에 없다.
3개를 세우고 'T'(teacher)을 중심으로 동, 서, 남, 북 모든 좌표를 보면서 T와 'S'의 사이에 이미 O가 있으면 넘어가는 방면 없으면 바로 다음 경우의 수를 확인하면 된다.
만약 모든 T와 S 사이에 O로 블로킹(blocking)이 된다면 가능한 사건이므로 YES를 출력하고 코드를 끄면(exit) 된다.
CODE
def find_student():
for teacher in teachers:
x, y = teacher
for i in range(x-1,-1,-1):
if graph[i][y] == 'O':break
elif graph[i][y] == 'S':
return False
for j in range(x+1,n):
if graph[j][y] =='O':break
elif graph[j][y] =='S':
return False
for i in range(y-1,-1,-1):
if graph[x][i] == 'O':break
elif graph[x][i] == 'S':
return False
for j in range(y+1,n):
if graph[x][j] =='O': break
elif graph[x][j] == 'S':
return False
return True
def solve(cnt):
if cnt == 0:
if find_student():
print('YES')
exit()
return
for i in range(n):
for j in range(n):
if graph[i][j] == 'X':
graph[i][j] = 'O'
solve(cnt-1)
graph[i][j] = 'X'
if __name__=='__main__':
n = int(input())
graph = [list(input().rstrip().split()) for _ in range(n)]
teachers = []
for i in range(n):
for j in range(n):
if graph[i][j] == 'T':
teachers.append((i,j))
solve(3)
print('NO')
728x90
반응형
'알고리즘 > [python] 백준 BOJ' 카테고리의 다른 글
[python] 백준 15711 환상의 짝궁 (0) | 2023.04.04 |
---|---|
[python] 백준 1826 연료 채우기 (0) | 2023.04.04 |
[python] 백준 17136 색종이 붙이기 (0) | 2023.04.03 |
[python] 백준 2485 가로수 (0) | 2023.03.30 |
[python] 백준 16637 괄호 추가하기 (0) | 2023.03.28 |
댓글