반응형
문제설명
현수와 친구들은 과자를 사먹기 위해 사다리 타기를 한다. 사다리 표현은 2차원 배열로 되어 있으며, 0은 평면을 의미하고, 사다리는 1로 표현한다. 현수는 특정 도착지점으로 도착하기 위해서는 몇 번째 열에서 출발해야 하는지 알고 싶다. 특정 도착지점은 2로 표시된다. 주어지는 지도의 크기는 10 by 10이다.
입력조건
- 10 by 10의 사다리 지도가 주어진다.
출력조건
- 출발지 열 번호를 출력한다.
사고과정
- 스스로 풀 때 위에서 출발해야 한다는 것 떄문에 0행의 모든 열에서 DFS 탐색을 수행하면서 마지막 행에서 도착지점이면 출력하도록 했다. 그런데 이렇게 구현하려 하니 방문 체크용 테이블을 구현하는 데 살짝 애를 먹었따.. 결국 구현은 했다.
- 풀이를 보니, 역발상으로 도착지점에서 역으로 올라갔다. 따라서 도착지점을 이미 알고 있으므로 도착지점에서 DFS 탐색 1번만 수행하면 출발 지점을 알 수 있다...이러한 아이디어 하나가 시간 복잡도를 확 줄여주는 듯 하다. 문제 범위가 10으로 고정되어 있으니 다행이지 범위가 커지면 내 구현 풀이는 시간 초과에러가 발생할 게 분명하다..
- 또 사다리 게임의 특성상 무조건 좌 -> 우 -> 하(거꾸로 가면 상) 순서를 지키면서 방향을 이동해야 하는데, 나는 for loop를 돌면서 갈 수 있는 좌표가 발견된 순간 break하는 방식으로 풀이했지만 강사님은 애초에 좌, 우, 상 방향을 if ~ elif ~ else 구문을 사용하셨다. 배울점이 많다!
풀이
- 강의 풀이(권장!)
board = [list(map(int, input().split())) for _ in range(10)]
ch = [[0] * 10 for _ in range(10)]
def DFS(x, y):
ch[x][y] = 1
if x == 0:
print(y)
else:
# 왼쪽으로 이동
if y-1 >= 0 and board[x][y-1] == 1 and ch[x][y-1] == 0:
DFS(x, y-1)
# 오른쪽으로 이동
elif y+1 >= 0 and board[x][y+1] == 1 and ch[x][y+1] == 0:
DFS(x, y+1)
else:
DFS(x-1, y)
for y in range(10):
if board[9][y] == 2:
DFS(9, y)
- 나의 풀이
board = [list(map(int, input().split())) for _ in range(10)]
visited = [[0] * 10 for _ in range(10)]
dx = [0, 0, 1] # 좌, 우, 하 -> 순서 이대로 지켜야 함
dy = [-1, 1, 0]
answer = -1
def dfs(x, y):
global answer
visited[x][y] = 1
# 도착점 도달했을 때, 방문 테이블의 0번째 행에서 1값을 갖고 있는 열이 출발지 열번호!
if x == 9 and board[x][y] == 2:
for j in range(10):
if visited[0][j] == 1:
answer = j
else:
for i in range(3):
nx, ny = x + dx[i], y + dy[i]
if 0 <= nx < 10 and 0 <= ny < 10:
if visited[nx][ny] == 0 and (board[nx][ny] == 1 or board[nx][ny] == 2):
dfs(nx, ny)
visited[nx][ny] = 0
break
visited[x][y] = 0 # 나중에 출발점 찾기 위해서 시작좌표도 0으로 방문 체크 풀어주기
for j in range(10):
if board[0][j] == 1:
dfs(0, j)
print('answer:', answer)
반응형
'알고리즘 삽질장' 카테고리의 다른 글
[인프런] 최대 선 연결하기 (0) | 2021.12.03 |
---|---|
[인프런] 피자 배달 거리 (0) | 2021.12.01 |
[인프런] 토마토 (0) | 2021.12.01 |
[인프런] 안전영역 (0) | 2021.11.30 |
[인프런] 섬나라 아일랜드 (0) | 2021.11.30 |