[백준] 18428번, 감시 피하기 (Python)

2021. 8. 20. 10:54·알고리즘/백준
728x90
반응형

문제

https://www.acmicpc.net/problem/18428

 

18428번: 감시 피하기

NxN 크기의 복도가 있다. 복도는 1x1 크기의 칸으로 나누어지며, 특정한 위치에는 선생님, 학생, 혹은 장애물이 위치할 수 있다. 현재 몇 명의 학생들은 수업시간에 몰래 복도로 빠져나왔는데, 복

www.acmicpc.net

 

코드

import collections
import sys

input = sys.stdin.readline
n = int(input())
graph = [list(input().split()) for _ in range(n)]
dx,dy = [-1,1,0,0], [0,0,-1,1]
queue = collections.deque()
check = False

def bfs():
    visited = [[False]*n for _ in range(n)]
    for i in range(n):
        for j in range(n):
            if graph[i][j] == 'T':
                queue.append((i,j))

    while queue:
        x,y = queue.popleft()
        for i in range(4):
            temp_x, temp_y = x,y
            while True:
                nx = temp_x + dx[i]
                ny = temp_y + dy[i]
                if 0 <= nx < n and 0 <= ny < n:
                    if graph[nx][ny] == 'X' and visited[nx][ny] == False:
                        visited[nx][ny] = True
                    elif graph[nx][ny] == 'S':
                        return False
                    elif graph[nx][ny] == 'O':
                        break
                    temp_x, temp_y = nx,ny
                else:
                    break
    return True

def recursive(index):
    global check
    if index == 3:
        if bfs():
            check = True
        return
        
    for i in range(n):
        for j in range(n):
            if graph[i][j] == 'X':
                graph[i][j] = 'O'
                recursive(index+1)
                graph[i][j] = 'X'

recursive(0)
if check:
    print("YES")
else:
    print("NO")

 

벽을 세워서 선생님이 모든 학생들을 찾지 못할때 YES를 출력하고 학생을 찾으면 NO를 출력하는 문제이다.

 

벽은 3개 세울수 있어서 완전탐색으로 모든경우에 벽을세워서 학생들을 가릴수 있는 경우가 있는지 확인했다.

 

재귀로 벽이 3개 세워졌을때 bfs를 실행하고 bfs에서는 선생님이 여러명 있을 수 있으니 for문을 돌아 모든 선생님('T')을 queue에 넣어준다.

 

선생님은 4방향을 확인할 수 있는데 거리에 상관없이 벽이 없다면 끝까지 볼 수 있다.

 

그러므로 while문을 이용해 벽이 없다면 쭉 탐색할 수 있게 만들었다. 학생을 발견했다면 False, bfs가 끝날때까지 발견하지 못하면 True를 반환하면 된다.

 

 

반응형
저작자표시 (새창열림)

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 1922번, 네트워크 연결 (Python)  (0) 2021.08.18
[백준] 1916번, 최소비용 구하기 (Python)  (0) 2021.08.18
[백준] 14888번, 연산자 끼워넣기 (Python)  (0) 2021.08.17
[백준] 16236번, 아기상어 (Python)  (0) 2021.08.16
[백준] 1759번, 암호 만들기 (Python)  (0) 2021.08.13
'알고리즘/백준' 카테고리의 다른 글
  • [백준] 1922번, 네트워크 연결 (Python)
  • [백준] 1916번, 최소비용 구하기 (Python)
  • [백준] 14888번, 연산자 끼워넣기 (Python)
  • [백준] 16236번, 아기상어 (Python)
wookcode
wookcode
공부한 내용들을 정리하고 기록하는 블로그입니다.
    반응형
  • wookcode
    wookcode
    wookcode
  • 전체
    오늘
    어제
    • 카테고리 (196)
      • study (1)
        • 아파치 카프카 애플리케이션 프로그래밍 with 자.. (0)
        • 인프런 (1)
      • Live Study (15)
      • Programming (14)
        • Java (8)
        • Python (1)
        • Springboot (5)
        • MSA (0)
      • 알고리즘 (117)
        • 백준 (58)
        • 프로그래머스 (59)
      • 에러로그 (5)
      • 항해99 (23)
      • 면접 (1)
      • 프로젝트 (1)
      • CS (19)
        • 네트워크 (2)
        • 운영체제 (2)
        • 데이터베이스 (2)
        • 컴퓨터구조 (1)
        • Java (8)
        • Spring (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    실전프로젝트
    괄호
    파이썬
    후기
    김영한
    SpringBoot
    브루트포스
    회고
    항해마켓
    스파르타코딩클럽
    정리
    코딩테스트
    java
    버그
    백준
    그리디
    카카오코딩테스트
    카카오인턴
    미니프로젝트
    SFlash
    jpa
    에러
    알고리즘
    항해99
    해결
    orm
    인프런
    spring
    조합
    프로그래머스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
wookcode
[백준] 18428번, 감시 피하기 (Python)
상단으로

티스토리툴바