감시 피하기

Updated:

  • python문법을 공부하기 위해 풀어본 문제
  • 1시간
  • 단순구현
  from itertools import combinations
  n = int(input())

  # python에서는 클래스를 사용하기 전에 클래스를 선언해 주어야 한다.
  class map:
      def __init__(self,r,c):
          self.r = r
          self.c = c

  arr = [[x for x in input().split()] for i in range(n)]
  # for i in range(n):
  #   print(arr[i])

  teachers = []
  area = []

  for i in range(n):
      for j in range(n):
          if arr[i][j] == 'T':
              teachers.append(map(i,j))
          if arr[i][j] == 'X':
              area.append(map(i,j))

  # 선생님 위치 출력
  # for i in range(len(teachers)):
  #     print(teachers[i].r,teachers[i].c)

  # 파이썬에서는 함수를 통해서 combination을 간단하게 구현할 수 있다.
  c_area = list(combinations(area,3))

  dr = [-1,1,0,0]
  dc = [0,0,-1,1]

  che_re = False

  for i in range(len(c_area)):
      che = False
      for j in range(len(c_area[i])):
          # print(c_area[i][j].r,c_area[i][j].c,"   ", end='')
          arr[c_area[i][j].r][c_area[i][j].c] = 'O'

      for j in range(len(teachers)):
          for k in range(4):
              nr = teachers[j].r
              nc = teachers[j].c
              while True:
                  nr += dr[k]
                  nc += dc[k]
                  if nr<0 or nc<0 or nr>=n or nc>=n:
                      # 끝점
                      break
                  if arr[nr][nc]=='O':
                      # 벽 발견
                      break
                  if arr[nr][nc]=='S':
                      # 학생 발견
                      che = True
                      for m in range(len(c_area[i])):
                          arr[c_area[i][m].r][c_area[i][m].c] = 'X'
                      break
              if che:
                  break
          if che:
              break
      # S(학생)을 발견했다면 다음 벽을 치기위해 모든 루프를 빠져나온다.
      if che==False:
          # S(학생) 발견못했다면 다로 빠져나온다.
          che_re = True
          break
  if che_re:
      print("YES")
  else:
      print("NO")

Leave a comment