[BOJ][⚪2][백준#02210] 숫자판 점프
작성:    
업데이트:
카테고리: BOJ Silver II
태그: BOJ, BOJ Silver, PS, Python
문제 출처
문제
5×5 크기의 숫자판이 있다. 각각의 칸에는 숫자(digit, 0부터 9까지)가 적혀 있다. 이 숫자판의 임의의 위치에서 시작해서, 인접해 있는 네 방향으로 다섯 번 이동하면서, 각 칸에 적혀있는 숫자를 차례로 붙이면 6자리의 수가 된다. 이동을 할 때에는 한 번 거쳤던 칸을 다시 거쳐도 되며, 0으로 시작하는 000123과 같은 수로 만들 수 있다. 숫자판이 주어졌을 때, 만들 수 있는 서로 다른 여섯 자리의 수들의 개수를 구하는 프로그램을 작성하시오.
입력
다섯 개의 줄에 다섯 개의 정수로 숫자판이 주어진다.
출력
첫째 줄에 만들 수 있는 수들의 개수를 출력한다.
예제
입력
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 2 1
1 1 1 1 1
출력
15
My Sol
def f(i, j, txt):
if len(txt)==6:
global arrSet
arrSet.add(txt)
return
didj = [(-1, 0), (1, 0), (0, 1), (0, -1)]
for di, dj in didj:
si, sj = i+di, j+dj
if not (0<=si<5 and 0<=sj<5): continue
f(si, sj, txt+mat[si][sj])
mat = [list(input().split()) for _ in range(5)]
arrSet = set()
for i in range(5):
for j in range(5):
f(i, j, mat[i][j])
print(len(arrSet))
완전 탐색과 DFS를 이용하여 풀 수 있는 문제였다. 완전탐색으로 5x5의 모든 칸을 돌면서 상하좌우 값을 string으로 붙이면서 진행한다. 그러다 txt의 길이가 6이 되면, 전역변수 arrSet에 txt를 add로 추가해준다. 이는 이미 set에 값이 있다면 중복을 제거할 수 있으므로 편한 방법이다.
이전에 왔던 길도 되돌아갈 수 있어 visited 배열이 필요하지 않았지만, 그 때문에 중복이 많이 발생할 수 있었다. 처음에는 이 중복을 제거하는 게 좋지 않을까 했지만, 끝까지 가봐야 어떤 문자인지가 결정된다는 결론에 이르러서 완전탐색으로 풀게 되었다.
결과
맞았습니다!!
댓글남기기