[BOJ][⚪2][백준#02210] 숫자판 점프

작성:    

업데이트:

카테고리:

태그: , , ,

문제 출처

BAEKJOON Online Judge #2210


문제

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 배열이 필요하지 않았지만, 그 때문에 중복이 많이 발생할 수 있었다. 처음에는 이 중복을 제거하는 게 좋지 않을까 했지만, 끝까지 가봐야 어떤 문자인지가 결정된다는 결론에 이르러서 완전탐색으로 풀게 되었다.


결과

맞았습니다!!

댓글남기기