728x90
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14vXUqAGMCFAYD
< 📝 문제 >
아래 그림과 같은 미로가 있다. 16*16 행렬의 형태로 만들어진 미로에서 흰색 바탕은 길, 노란색 바탕은 벽을 나타낸다.
가장 좌상단에 있는 칸을 (0, 0)의 기준으로 하여, 가로방향을 x 방향, 세로방향을 y 방향이라고 할 때, 미로의 시작점은
(1, 1)이고 도착점은 (13, 13)이다.
주어진 미로의 출발점으로부터 도착지점까지 갈 수 있는 길이 있는지 판단하는 프로그램을 작성하라.
아래의 예시에서는 도달 가능하다.
아래의 예시에서는 출발점이 (1, 1)이고, 도착점이 (11, 11)이며 도달이 불가능하다.
< ❓ 생각 >
미로문제에서 미로 크기만 바뀜
https://chaemi720.tistory.com/53
< 💻 코드 >
def start(maze):
# 출발지 위치
for i in range(16):
for j in range(16):
if maze[i][j] == 2:
return i, j
for _ in range(10):
# 테스트 케이스 번호
tc = int(input())
# 미로
# 벽(1), 길(0), 출발점(2), 도착점(3)
maze = [list(map(int,input())) for _ in range(16)]
# 출발지 찾기
r,c = start(maze)
stack = []
stack.append((r,c))
# 방문했던 곳 표시
visited = [[0]*16 for _ in range(16)]
visited[r][c] = 1
# 기본 값 : 도착 못함
result = 0
while stack:
# 현 위치
cr,cc = stack[-1]
# 도착?
if maze[cr][cc] == 3:
result = 1
break
# 이동
for dr,dc in [[1,0],[-1,0],[0,1],[0,-1]]:
nr = cr+dr
nc = cc+dc
# 이동가능한 곳 -> 미로 안, 통로, 방문X
if 0 <= nr < 16 and 0 <= nc < 16 and maze[nr][nc] != 1 and visited[nr][nc] == 0:
# 방문 표시
visited[nr][nc] = 1
stack.append((nr,nc))
break
# 현 위치에서 갈 수 있는 길이 없다면 한 칸 되돌아가기
else:
stack.pop()
print(f'#{tc} {result}')
< ❗ 느낀 점 >
728x90
반응형
'TIL - 프로그래밍 > Python 알고리즘' 카테고리의 다른 글
[SWEA] 1231. 중위순회 - Python (0) | 2022.04.05 |
---|---|
[SWEA] 5102. 노드의 거리 - Python (0) | 2022.04.05 |
[SWEA] 3499. 퍼펙트 셔플 - Python (0) | 2022.04.01 |
[SWEA] 1860. 진기의 최고급 붕어빵 - Python (0) | 2022.03.30 |
[SWEA] 5203. 베이비진 게임 - Python (0) | 2022.03.29 |
댓글