[알고리즘] 사다리 타기(DFS)
(문제) 사다리 타기(DFS)
현수와 친구들은 과자를 사먹기 위해 사다리 타기를 합니다.
사다리 표현은 2차원 평면은 0으로 채워지고, 사다리는 1로 표현합니다.
현수는 특정도착지점으로 도착하기 위해서는 몇 번째 열에서 출발해야 하는지 알고싶습니다.
특정 도착지점은 2로 표기됩니다.
여러분이 도와주세요.
사다리의 지도가 10 * 10이면
특정목적지인 2에 도착하려면 7번 열 출발지에서 출발하면 됩니다.
입력설명
10 * 10의 사다리 지도가 주어집니다.
출력설명
출발지 열 번호를 출력하세요.
테스트케이스
입력예제 | 출력예제 |
---|---|
1 0 1 0 0 1 0 1 0 1 1 0 1 1 1 1 0 1 0 1 1 0 1 0 0 1 0 1 0 1 1 0 1 0 0 1 0 1 1 1 1 0 1 0 0 1 0 1 0 1 1 0 1 1 1 1 0 1 0 1 1 0 1 0 0 1 0 1 1 1 1 1 1 0 0 1 0 1 0 1 1 0 1 0 0 1 1 1 0 1 1 0 1 0 0 2 0 1 0 1 |
7 |
1 0 1 0 0 1 0 1 0 1 1 0 1 1 1 1 0 1 0 1 1 0 1 0 0 1 0 1 0 1 1 0 1 0 0 1 0 1 1 1 1 1 1 0 0 1 0 1 0 1 1 0 1 1 1 1 0 1 0 1 1 0 1 0 0 1 0 1 1 1 1 1 1 0 0 1 0 1 0 1 1 0 1 0 0 1 1 1 0 1 1 0 2 0 0 1 0 1 0 1 |
5 |
1 0 1 0 0 1 0 1 0 1 1 0 1 1 1 1 0 1 0 1 1 0 1 0 0 1 0 1 0 1 1 0 1 0 0 1 0 1 1 1 1 1 1 0 0 1 0 1 0 1 1 0 1 1 1 1 0 1 0 1 1 0 1 0 0 1 0 1 1 1 1 1 1 0 0 1 1 1 0 1 1 0 1 0 0 1 1 1 0 1 1 0 1 0 0 2 0 1 0 1 |
0 |
1 0 1 0 0 1 0 1 0 1 1 0 1 1 1 1 0 1 0 1 1 0 1 0 0 1 0 1 0 1 1 0 1 0 0 1 0 1 1 1 1 1 1 0 0 1 0 1 0 1 1 0 1 1 1 1 0 1 0 1 1 0 1 0 0 1 0 1 1 1 1 1 1 0 0 1 1 1 0 1 1 0 1 0 0 1 1 1 0 1 1 0 1 0 0 1 0 1 0 2 |
9 |
1 0 1 0 0 1 0 1 0 1 1 0 1 1 1 1 0 1 0 1 1 0 1 0 0 1 1 1 0 1 1 0 1 0 0 1 0 1 1 1 1 1 1 0 0 1 1 1 0 1 1 0 1 1 1 1 0 1 0 1 1 0 1 0 0 1 0 1 1 1 1 1 1 0 0 1 1 1 0 1 1 0 1 0 0 1 1 1 0 1 1 0 1 0 0 1 0 1 0 2 |
7 |
해결방법
- 가장 위에 즉, 0행에서 값이 1인 경우에서 시작하기 때문에 반복문을 0~9까지 1의 값에 있는 0행 기준으로 돈다.
- 반복할 때, 들린 곳을 저장하는 리스트는 0으로 전부 초기화 한다.
- 우선 왼쪽, 오른쪽, 아래 순으로 순회를 할 것이다. 그리고 만약 아래로 내려가야하는 곳이 없을 경우 즉 return을 했을 경우, 반복문을 break하여 순회를 빠져 나온다.
- 들렸던 곳을 저장하는 리스트에 들리지 않은 곳을 순회한다. 순회할 경우 들렸던 곳은 들렸다고 체크를 한다.
- 그래서 조건은 지금가려고 하는 곳의 좌표가 들렸던 곳이 아니거나 가려고 하는 곳에 1의 값이 있으면 그 곳으로 움직인다.
- 이 반복은 행이 9가 될 때 까지 반복이 되며, 만약 2를 만났을 경우 1번에서 0행에 시작한 x열을 print한다
동작 시각화
반복문을 돌려서 가장 위에 있는 행을 순회하여 1이 있는 곳부터 시작을 한다.
들렸던 곳을 저장하는 리스트
- 0인덱스
- 2인덱스
- 5인덱스
- 7인덱스
- 9인덱스
코드
import sys
def DFS(L, x, y):
if x == 9 and maps[x][y] == 2:
print(L)
sys.exit(0)
elif x == 9 and maps[x][y] == 1:
return
else:
# 왼쪽 오른쪽 밑에 체크하기
for i in range(3):
if 0 <= x + dx[i] < 10 and 0 <= y + dy[i] < 10:
# 0이 아닌 다른 것들
if maps[x + dx[i]][y + dy[i]] != 0:
# 내가 가보지 못한 곳으로 가기
if ch_maps[x + dx[i]][y + dy[i]] != 1:
ch_maps[x][y] = 1
DFS(L, x + dx[i], y + dy[i])
# 만약 마지막 까지 돌았을 때, 밑으로 가는게 없을 경우 반복문 끝낸다!
break
maps = [list(map(int, input().split())) for _ in range(10)]
# 좌, 우, 하
# 행
dx = [0, 0, 1]
# 열
dy = [-1, 1, 0]
for j in range(10):
ch_maps = [[0] * 10 for _ in range(10)]
if maps[0][j] == 1:
DFS(j, 0, j)
댓글남기기