[이것이 코딩 테스트다 with Python] Chapter 13. DFS/BFS - 감시 피하기

2023. 12. 28. 21:29·코딩테스트/이것이 코딩 테스트다
반응형

< 감시 피하기 >

 

💬 문제 설명

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

....

 

  입력   출력
  5
  X  S  X  X  T
  T  X  S  X  X
  X  X  X  X  X
  X  T  X  X  X
  X  X  T  X  X
  YES
  4
  S  S  S  T
  X  X  X  X
  X  X  X  X
  T  T  T  X
  NO

💬 입력 조건

  • 첫째 줄에 N ( 3 ≤ N ≤ 6 )
  • 둘째 줄부터 N개의 원소들 ( S : 학생,  T : 선생님,  X : 빈칸)  
  • 선생님 수 ( 1 ≤ T의 수 ≤ 5 ), 학생 수 ( 1 ≤ S의 수 ≤ 30 )

💬 출력 조건

  • 모든 학생들이 감시를 피하는 경우 있으면 "YES" 없으면 "NO"

✍ 문제요약

N X N 크기의 복도가 있다. 특정한 위치에 선생님(T), 학생(S) 혹은 장애물이 위치할 수 있다. 선생님들이 본인의 위치에서 상, 하, 좌, 우로 감시했을 때 학생이 보이면 감시를 피하지 못한 것이고, 장애물에 가려서 보이지 않는 등등의 상황이면 감시를 피한 것이다. 무조건 3개의 장애물을 설치 해야할 때 감시를 피하는 경우가 한번이라도 있으면 "YES" 그렇지 않으면 "NO"를 출력하라.

💯 문제링크

백준18428 문제와 동일하다.

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

 

18428번: 감시 피하기

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

www.acmicpc.net


✅  문제 풀이

  • 기둥 3개를 임의로 세워서 선생님의 눈을 피할 수 있는 Case를 찾아야한다.
  • Combinations으로 기둥 3개를 세우는 모든 케이스를 완전탐색한다.
  • 선생님의 수 최대 5, 학생 수 최대 30 선생님이 적으니 선생님 기준으로 학생을 확인한다.
import sys
from itertools import combinations
input = sys.stdin.readline

def isMeet():
    global meet
    for r, c in T:
        for dr, dc in ((-1, 0), (0, 1), (1, 0), (0, -1)): # 선생님 기준 4방향 확인
            for n in range(1, N):                         # 각 방향으로 n칸 씩 이동
                nr, nc = r + dr * n, c + dc * n
                if 0 <= nr < N and 0 <= nc < N:  # 그래프 범위 안에 있을 때만
                    if G[nr][nc] == "O":         # 장애물 만나면
                        break                    # 해당 방향 탐색 끝
                    elif G[nr][nc] == "S":       # 학생 만나면
                        return True              # 감시를 피하지 못헀음

    meet = False  # 만나지 않았다
    return False  # 감시를 피했다

N = int(input())
G, X, T = [], [], []
for R in range(N):
    tmp = list(map(str,input().split()))
    G.append(tmp)                               # 복도 그래프 만들기
    for C in range(N):
        if tmp[C] == "X" : X.append((R,C))      # 빈공간 위치 저장
        elif tmp[C] == "T" : T.append((R,C))    # 선생님 위치 저장

meet = True
for blocks in combinations(X,3):           # 빈공간 3곳에 임의로 장애물 설치
    for r, c in blocks : G[r][c] = "O"     # 장애물 세우고 확인
    if not isMeet() : break                # False가 반환 되면 감시를 피했으니 break
    for r, c in blocks : G[r][c] = "X"     # 장애물 회수

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

반응형

'코딩테스트 > 이것이 코딩 테스트다' 카테고리의 다른 글

[이것이 코딩 테스트다 with Python] Chapter 14. 정렬 - 국영수  (0) 2024.01.05
[이것이 코딩 테스트다 with Python] Chapter 13. DFS/BFS - 블록 이동하기  (0) 2024.01.04
[이것이 코딩 테스트다 with Python] Chapter 13. DFS/BFS - 연산자 끼워 넣기  (0) 2023.12.27
[이것이 코딩 테스트다 with Python] Chapter 13. DFS/BFS - 괄호 변환  (1) 2023.12.23
[이것이 코딩 테스트다 with Python] Chapter 13. DFS/BFS - 경쟁적 전염  (4) 2023.12.21
'코딩테스트/이것이 코딩 테스트다' 카테고리의 다른 글
  • [이것이 코딩 테스트다 with Python] Chapter 14. 정렬 - 국영수
  • [이것이 코딩 테스트다 with Python] Chapter 13. DFS/BFS - 블록 이동하기
  • [이것이 코딩 테스트다 with Python] Chapter 13. DFS/BFS - 연산자 끼워 넣기
  • [이것이 코딩 테스트다 with Python] Chapter 13. DFS/BFS - 괄호 변환
hyo_nu
hyo_nu
Annoying Orange Developer
  • hyo_nu
    AOD
    hyo_nu
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 코딩테스트
        • 이것이 코딩 테스트다
        • 알고리즘
      • Style Sheet
        • CSS
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

    • Github
    • Velog
  • 공지사항

  • 인기 글

  • 태그

    dp
    이것이 취업을 위한 코딩테스트다
    그리디
    Algorithm
    알고리즘
    dfs
    취업
    정렬
    코딩테스트
    이진탐색
    그리기
    구현
    코딩테스트다
    브루트포스
    python
    코딩
    BFS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
hyo_nu
[이것이 코딩 테스트다 with Python] Chapter 13. DFS/BFS - 감시 피하기
상단으로

티스토리툴바