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의 인덱싱작업으로 해줬기 때문에 이해를 하고 들어가기가야하는 코드이기때문에 이런방식보단 책의 방식이 훨씬 좋아보였다!!!