Thief of Wealth
Published 2020. 10. 23. 01:15
[BOJ] 2210 숫자펌프 개발/알고리즘

문제

5×5 크기의 숫자판이 있다. 각각의 칸에는 숫자(digit, 0부터 9까지)가 적혀 있다. 이 숫자판의 임의의 위치에서 시작해서, 인접해 있는 네 방향으로 다섯 번 이동하면서, 각 칸에 적혀있는 숫자를 차례로 붙이면 6자리의 수가 된다. 이동을 할 때에는 한 번 거쳤던 칸을 다시 거쳐도 되며, 0으로 시작하는 000123과 같은 수로 만들 수 있다.

숫자판이 주어졌을 때, 만들 수 있는 서로 다른 여섯 자리의 수들의 개수를 구하는 프로그램을 작성하시오.

입력

다섯 개의 줄에 다섯 개의 정수로 숫자판이 주어진다.

출력

첫째 줄에 만들 수 있는 수들의 개수를 출력한다.

 

 

간단한 dfs 문제로서 크게 고민하지 않아도 된다. n도 5로 매우 작아서 완전탐색이라고도 할 수 있다.

 

import sys
sys.setrecursionlimit(10**6)
board = []
n = 5
for _ in range(n):
    board.append([*map(int, input().rstrip().split(" "))])

answer = set()


def dfs(x, y, string):
    global answer, board, n
    if(len(string) == 6):
        answer.add(string)
        return

    for a, b in [(-1, 0), (1, 0), (0, -1), (0, 1)]:
        if(x+a >= 0 and y+b >= 0 and x+a < n and y+b < n):
            dfs(x+a, y+b, string+str(board[x+a][y+b]))


for i in range(5):
    for j in range(5):
        dfs(i, j, str(board[i][j]))

print(len(answer))

'개발 > 알고리즘' 카테고리의 다른 글

[BOJ] 2644 촌수계산  (0) 2020.10.24
[BOJ] 11725 트리의 부모 찾기  (0) 2020.10.24
[BOJ] 17141 연구소2 파이썬  (0) 2020.10.21
[BOJ] 치킨배달 파이썬  (0) 2020.10.20
[BOJ] 18352 특정한 거리의 도시 찾기  (0) 2020.10.19
profile on loading

Loading...