[문제]
4×4 크기의 격자판이 있다. 격자판의 각 격자칸에는 0부터 9 사이의 숫자가 적혀 있다.
격자판의 임의의 위치에서 시작해서, 동서남북 네 방향으로 인접한 격자로 총 여섯 번 이동하면서, 각 칸에 적혀있는 숫자를 차례대로 이어 붙이면 7자리의 수가 된다.
이동을 할 때에는 한 번 거쳤던 격자칸을 다시 거쳐도 되며, 0으로 시작하는 0102001과 같은 수를 만들 수도 있다.
단, 격자판을 벗어나는 이동은 가능하지 않다고 가정한다.
격자판이 주어졌을 때, 만들 수 있는 서로 다른 일곱 자리 수들의 개수를 구하는 프로그램을 작성하시오.
[입력]
첫 번째 줄에 테스트 케이스의 수 T가 주어진다.
각 테스트 케이스마다 4개의 줄에 걸쳐서, 각 줄마다 4개의 정수로 격자판의 정보가 주어진다.
[출력]
각 테스트 케이스마다 ‘#x ’(x는 테스트케이스 번호를 의미하며 1부터 시작한다)를 출력하고, 격자판을 이동하며 만들 수 있는 서로 다른 일곱 자리 수들의 개수를 출력한다.
[풀이]
DFS를 사용해서 7번째까지 탐색한다. 따로 중복 방문 조건이 없으므로, depth 말고는 조건을 두지 않아도 된다.
따라서 depth가 7이면 return 하는 조건으로 재귀 탐색을 하고, 그 외에 조건은 i, j가 0이상 4미만 이어야 한다.
중복을 검사하는 알고리즘은 파이썬의 경우에는 container를 set로 설정하면 손쉽게 중복을 처리할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
d = [[-1, 0],[1, 0],[0, -1],[0, 1]]
def DFS(maps, i, j, depth, num):
if depth == 7:
ans.add(num)
return
for idx in range(4):
nextI, nextJ = i+d[idx][0], j+d[idx][1]
if nextI >= 0 and nextI < 4 and nextJ >= 0 and nextJ < 4:
DFS(maps, nextI, nextJ, depth+1, num + str(maps[i][j]))
def solve(idx):
maps = []
for i in range(4):
maps.append(list(map(int, input().split())))
for i in range(4):
for j in range(4):
DFS(maps, i, j, 0, '')
print('#%d ' % idx, end='')
print(len(ans))
T = int(input())
for i in range(1, T+1):
ans = set()
solve(i)
|
cs |
'알고리즘' 카테고리의 다른 글
[파이썬 | SW Expert Academy] 전자카트 (0) | 2020.04.19 |
---|---|
[파이썬 | SW Expert Academy] 최소합 (0) | 2020.04.18 |
[파이썬 | BOJ | 2580] 스도쿠 (0) | 2020.03.18 |
[파이썬 | BOJ | 2096] 내려가기 (0) | 2020.03.10 |
[파이썬 | BOJ | 14502] 연구소 (0) | 2020.02.27 |