Updated:

1. 문제 풀이

조합과 BFS를 활용해서 문제를 해결하였습니다.

  • $5\times5$ 칸마다 0 ~ 24까지 번호를 붙입니다.
  • 조합을 활용해 0 ~ 24까지의 숫자 중 7개를 선택하는 모든 경우의 수를 탐색합니다.
  • 선택된 7개의 수 중에서 이다솜파 4명의 위치가 포함되어있다면 BFS를 활용해 가로나 세로로 인접해있는지 확인합니다.

2. 코드

import sys
from collections import deque
from itertools import combinations,chain
def input(): return sys.stdin.readline().rstrip()

def check(case):
    my = [1,-1,0,0]
    mx = [0,0,1,-1]
    visited = set(case[1:])
    q = deque([case[0]])
    while q:
        y, x = q.popleft()
        for idx in range(4):
            dy, dx = y + my[idx], x + mx[idx]
            if dy < 0 or dx >= 5 or dx < 0 or dx >= 5: continue
            if (dy, dx) in visited:
                visited.remove((dy,dx))
                q.append((dy,dx))
    if visited:
        return False
    return True

matrix = [ list(input()) for _ in range(5)]
nums = [s for i, s in enumerate(chain(*matrix))]
location = {5 * i + j: (i, j) for i in range(5) for j in range(5)}

result = 0
for array in combinations(range(25), 7):
    count = sum(map(lambda x: 1 if nums[x] == 'S' else 0, array))
    if count >= 4 and check(list(map(lambda x: location[x], array))):
        result += 1
print(result)

itertools의 chain 함수는 다음과 같이 동작합니다.

# 출처: https://docs.python.org/ko/3/library/itertools.html#itertools.chain
def chain(*iterables):
    # chain('ABC', 'DEF') --> A B C D E F
    for it in iterables:
        for element in it:
            yield element

Leave a comment