-문제: https://www.acmicpc.net/problem/18428
18428번: 감시 피하기
NxN 크기의 복도가 있다. 복도는 1x1 크기의 칸으로 나누어지며, 특정한 위치에는 선생님, 학생, 혹은 장애물이 위치할 수 있다. 현재 몇 명의 학생들은 수업시간에 몰래 복도로 빠져나왔는데, 복
www.acmicpc.net
이전에 풀었던 연구실 문제와 풀이가 같다고 생각해서 그대로 풀다가 삽질했던 문제.
마지막에는 메모리 초과까지 발생했다.
문제 풀이 아이디어
1. 장애물을 설치하고
2. 선생님 주변에 학생이 있는지 확인
주변,확인 함수 구현 / process, watch
3. 없으면 True 반환, 있으면 False 반환하고
4. 그 값을 기준으로 답 출력
연구실문제와 이 문제가 다른 점은 연구실 문제는 해당 위치 위,아래,좌,우만 보면 됐지만.
여기는 한 방향에서 O나 S가 나올때까지 탐색을 할 수 있다는 점이다.
이는 while i>=0 또는 while i<n 형태로 구현하면 된다
선생님 시야에 학생이 들어온다면 process는 False를 반환한다.
만약 아니라면 True를 반환하고, 이 경우에 YES를 출력, 아니면 NO를 출력한다.
무작위로 하는 경우에는 항상 연산 끝나고 되돌려 놓기
for data in combinations(spaces,3):
for x,y in data:
board[x][y]='O'
if not process():
find=True
break
for x,y in data:
board[x][y]='X'
-정답풀이
from itertools import combinations
n=int(input())
board=[]
teachers=[]
spaces=[]
for i in range(n):
board.append(list(input().split()))
for j in range(n):
if board[i][j]=='T':
teachers.append((i,j))
if board[i][j]=='X':
spaces.append((i,j))
def watch(x,y,direction):
if direction ==0:
while y>=0:
if board[x][y]=='S':
return True
if board[x][y]=='O':
return False
y-=1
if direction ==1:
while y<n:
if board[x][y]=='S':
return True
if board[x][y]=='O':
return False
y+=1
if direction ==2:
while x>=0:
if board[x][y]=='S':
return True
if board[x][y]=='O':
return False
x-=1
if direction ==3:
while x<n:
if board[x][y]=='S':
return True
if board[x][y]=='O':
return False
x+=1
return False
def process():
for x,y in teachers:
for i in range(4):
if watch(x,y,i):
return True
return False
find=False
for data in combinations(spaces,3):
for x,y in data:
board[x][y]='O'
if not process():
find=True
break
for x,y in data:
board[x][y]='X'
if find:
print('YES')
else:
print('NO')
'백준 > Search' 카테고리의 다른 글
[백준/이진탐색] 2110번: 공유기 설치 (0) | 2022.05.15 |
---|---|
[zoho 인터뷰/이진탐색] 정렬된 배열에서 특정 수의 개수 구하기 (0) | 2022.05.12 |
[dfs/백준] 14888번: 연산자 끼워넣기 (0) | 2022.05.08 |
[bfs/백준] 18405번: 경쟁적 전염 (0) | 2022.05.06 |
[백준/bfs] 14502번: 연구실/ 다시 푼 것 (0) | 2022.05.05 |