Algorithm (PS)
[백준] 18428번: 감시 피하기
minjiwoo
2023. 3. 5. 20:57
728x90
https://www.acmicpc.net/problem/18428
18428번: 감시 피하기
NxN 크기의 복도가 있다. 복도는 1x1 크기의 칸으로 나누어지며, 특정한 위치에는 선생님, 학생, 혹은 장애물이 위치할 수 있다. 현재 몇 명의 학생들은 수업시간에 몰래 복도로 빠져나왔는데, 복
www.acmicpc.net
구현 + 브루트포스 + 그래프 탐색 문제였다.
N 값이 3 ~ 6 으로 작아서 브루트포스로 장애물을 설치할 3군데를 정해서 풀어도 되는 문제였다.
선생님이 움직이지 않아서 상하좌우 방향으로 세로줄 전체와 가로줄 전체만 확인해주면 되었다.
from itertools import combinations
import sys
input = sys.stdin.readline
n = int(input())
teacher = []
blank = [] # 장애물 설치 가능 빈칸
board = [list(input().split()) for _ in range(n)]
result = False
for i in range(n):
for j in range(n):
if board[i][j] == 'T':
teacher.append([i, j])
if board[i][j] == 'X':
blank.append([i, j])
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
def check_range(i, j):
if 0 <= i < n and 0 <= j < n:
return True
else:
return False
def seek_student():
for tx, ty in teacher:
for i in range(4):
nx = tx + dx[i]
ny = ty + dy[i]
while True:
if not check_range(nx, ny):
break
if board[nx][ny] == 'S':
return False
elif board[nx][ny] == 'O':
break
nx += dx[i]
ny += dy[i]
return True
for test_case in combinations(blank, 3):
for x, y in test_case:
board[x][y] = 'O'
temp_result = seek_student()
if temp_result: # True
result = True
break
for x, y in test_case:
board[x][y] = 'X'
if result:
print("YES")
else:
print("NO")
728x90