사다리 타기(DFS)
현수와 친구들은 과자를 사먹기 위해 사다리 타기를 합니다. 사다리 표현은 2차원 평면은 0으
로 채워지고, 사다리는 1로 표현합니다. 현수는 특정도착지점으로 도착하기 위해서는 몇 번째
열에서 출발해야 하는지 알고싶습니다. 특정 도착지점은 2로 표기됩니다. 여러분이 도와주세
요. 사다리의 지도가 10*10이면
특정목적지인 2에 도착하려면 7번 열 출발지에서 출발하면 됩니다.
▣ 입력설명
10*10의 사다리 지도가 주어집니다.
▣ 출력설명
출발지 열 번호를 출력하세요.
▣ 입력예제 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 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
▣ 출력예제 1
7
문제풀이
모든 출발지인 맨 위에서부터 출발하면 비효율적
-> 목적지를 알고있기 때문에 목적지에서 출발해서 위로 올라가는 형식!
행이 0인 경우 종료하면 정답
문제해결
사다리 게임의 특성상 무조건 좌 -> 우 -> 하(거꾸로 가면 상) 순서를 지키면서 방향을 이동
import sys
sys.stdin = open("인프런.txt", "r")
def DFS(current_x, current_y) :
visite_list[current_x][current_y] = True
#지도의 맨 위쪽에 도달 하는 경우 종료
if current_x == 0 :
print(current_y)
else :
#<-- 왼쪽 이동(y-1)
#왼쪽 끝인 0보다 크면서 갈수있는 길(1)인경우 아직 방문하지 않은 경우(False)
if current_y-1 >= 0 and map_data[current_x][current_y-1] == 1 and visite_list[current_x][current_y-1] == False :
DFS(current_x, current_y-1)
#--> 오른쪽 이동(y+1)
#오른쪽 끝인 n보다 크면서 수있는 길(1)인경우 아직 방문하지 않은 경우(False)
elif current_y < 10-1 and map_data[current_x][current_y+1] == 1 and visite_list[current_x][current_y+1] == False :
DFS(current_x, current_y+1)
#위쪽 이동
#왼쪽, 오른쪽 둘다 못가는 경우 위쪽으로 이동
else :
DFS(current_x-1, current_y)
map_data = []
for i in range(10) :
data = list(map(int, input().split()))
map_data.append(data)
visite_list = [[False] * 10 for _ in range(10)]
for w in range(10) :
#출발지는 맨 아래인 9행, w열에서 시작
if map_data[9][w] == 2 :
DFS(9, w)
'코테풀이 > DFS' 카테고리의 다른 글
[백준 | 실버2] 유기농 배추(DFS, 떨어져 있는 영역 찾기) (0) | 2022.05.29 |
---|---|
[백준 | 골드5] 치킨배달(DFS) (0) | 2022.04.19 |
[백준 | 실버1] 2468번: 안전 영역(DFS, 떨어진 영역 카운트) (0) | 2022.04.15 |
[인프런 | 파이썬 알고리즘] 등산경로(DFS, 높은곳만 이동, 출발지-목적지) (0) | 2022.04.04 |
[인프런 | 파이썬 알고리즘] 섬나라 아일랜드(DFS, BFS, 8방향 좌표 이동) (0) | 2022.03.28 |
[인프런 | DFS] 사다리타기(이차원 리스트 밑에서부터 이동)