---
# System prepended metadata

title: 이코테 유형별 기출문제

---

# 이코테 유형별 기출문제

## DFS/BFS

### 감시 피하기
풀이특징
- 조합 사용: from `itertools` import `combinations`
- 빈칸 위치들, 선생님 위치들 배열로 저장
- 빈칸 위치들 중 3군데를 조합을 통해 장애물 설치
- 각 조합별로 각 선생님 위치에서 각 방향마다 움직이면서 학생이 있는지를 확인
```python
# T: 선생, S: 학생, O: 장애물
# 장애물을 3개 설치하여 모든 학생이 선생님의 감시를 피할 수 있는지 출력
from itertools import permutations
import copy
moves = [(-1, 0), (1, 0), (0, -1), (0, 1)]

# 학생들이 모두 피해질 수 있는지 여부 함수
def canAvoid(graph, teachers):
    for i, j in teachers:
        for move in moves:
            x, y = i, j
            # 한 방향에 대해 움직일 수 있을때까지 확인
            while True:
                nextX, nextY = x+move[0], y+move[1]
                # 움직일 수 없는 경우 다음방향 탐색으로 이동
                if nextX < 0 or nextX >= n:
                    break
                if nextY < 0 or nextY >= n:
                    break
                # 장애물인 경우 다음방향 탐색으로 이동
                if graph[nextX][nextY] == 'O':
                    break
                # 학생을 만난 경우 종료
                elif graph[nextX][nextY] == 'S':
                    return False
                x, y = nextX, nextY
    return True

n = int(input())
graph = []
empty = []
teachers = []
for i in range(n):
    graph.append(list(input().split()))
    for j in range(n):
        if graph[i][j] == 'X':
            empty.append((i, j))
        elif graph[i][j] == 'T':
            teachers.append((i, j))

# 빈공간 중 3가지 조합
can = False
for locations in permutations(empty, 3):
    checkGraph = copy.deepcopy(graph)
    for i, j in locations:
        checkGraph[i][j] = 'O'
    
    # 학생들 모두 피해지는 경우 종료
    if canAvoid(checkGraph, teachers):
        can = True
        break

print("YES" if can else "NO")

```