백준 18428 파이썬

임규성·2023년 1월 26일
1
post-custom-banner

문제 설명

->링크<-

해결 방법

idea1. 벽을 세우는 모든 경우를 탐색했다!!!
먼저 모든 경우를 세기전에는 이과정이 매우 만은 시간을 잡아먹을 수 있다는 생각을 해야되고
그래서 최대연산횟수를 계산해봤다. 맵의 최대칸의 수는 36이므로 이데따라

"combi(36,3) X (is_hide()함수의 최대 연산횟수)" 를
계산 하면 최대 연산횟수를 계산하면 되고 이는 2초안에 충분히 끝난느 연산횟수였다.

idea2. 선생님이 발견을 할 수 있는지 여부를 리턴하는 함수의 구현
이함수에서는 인덱싱을 하는 과정이 확실히 꼼꼼함이 필요했고 나머지는 단순했다 왜냐하면
벽을 3개 세웠을 때 map을 기준으로 선생님 상하좌우만 for문으로 돌려주면 되기때문이다.

두개의 아이디어를 기반으로 코드를 짜보면 이렇게 나온다.

해답 코드

import sys
import copy
from itertools import combinations

def is_hide(Nmatrix, t_list):
  size = len(matrix[0])
  #매개변수로 받은 위치에서 학생들이 상하좌우로 보이는지 확인
  for spot in t_list:
    #상방향 확인
    for i in range(spot[0]):
      if Nmatrix[spot[0]-i-1][spot[1]] == 'O':
        break
      if Nmatrix[spot[0]-i-1][spot[1]] == 'S':
        return False
    #하방향 확인
    for i in range(size-1-spot[0]):
      if Nmatrix[spot[0]+i+1][spot[1]] == 'O':
        break
      if Nmatrix[spot[0]+i+1][spot[1]] == 'S':
        return False
    #좌방향 확인
    for i in range(spot[1]):
      if Nmatrix[spot[0]][spot[1]-i-1] == 'O':
        break
      if Nmatrix[spot[0]][spot[1]-i-1] == 'S':
        return False
    #우방향 확인
    for i in range(size-1-spot[1]):
      if Nmatrix[spot[0]][spot[1]+i+1] == 'O':
        break
      if Nmatrix[spot[0]][spot[1]+i+1] == 'S':
        return False
  return True      

input = sys.stdin.readline
N = int(input().rstrip())
matrix = []
for i in range(N):
  matrix.append(list(input().split()))
#선생님들 위치 리스트로 뽑아내기
#빈공간 좌표 리스트로 뽑아내기
empty = []
teachers = []
for i in range(N):
  for j in range(N):
    if matrix[i][j] == 'T':
      teachers.append((i,j))
    if matrix[i][j] == 'X':
      empty.append((i,j))
#모든 경우의수에서 탐색
result = False
for case in combinations(empty, 3):
  first, second, third = case
  #임의의 공간 3개에 벽생성
  new_matrix = copy.deepcopy(matrix)
  new_matrix[first[0]][first[1]] = 'O'
  new_matrix[second[0]][second[1]] = 'O'
  new_matrix[third[0]][third[1]] = 'O'

  if is_hide(new_matrix, teachers) == True:
    result = True
#결과값 출력
if result == True:
  print('YES')
else:
  print('NO')

걸린 시간

차근차근 하면서 큰 어려움없이 풀어냈다. 다만 장애물이 없었는데도
속도가 살짤 아쉬웠다.

다른사람의 코드를 보고난 후

책에서의 해결방법은 is_hide()함수의 구현에서 차이가 났는데
매개변수로 direction을 받아서 주어진 방향에서만 확인하는 함수로 메 인문에서 함수를 쪼개는(?)느낌으로 했다 이녀석이 훨씬 눈에 보기는 좋았다. 왜냐하면 나는

#상방향 확인
  for i in range(spot[0]):
    if Nmatrix[spot[0]-i-1][spot[1]] == 'O':
      break
    if Nmatrix[spot[0]-i-1][spot[1]] == 'S':
      return False

위에처럼 Nmatrix의 인덱싱작업으로 해줬기 때문에 이해를 하고 들어가기가야하는 코드이기때문에 이런방식보단 책의 방식이 훨씬 좋아보였다!!!

profile
삶의 질을 높여주는 개발자
post-custom-banner

0개의 댓글