본문 바로가기
TIL - 프로그래밍/Python 알고리즘

[미로1] 1226. 미로1 - Python

by chaemj97 2022. 4. 2.
728x90

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14vXUqAGMCFAYD 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

< 📝 문제 >
아래 그림과 같은 미로가 있다. 16*16 행렬의 형태로 만들어진 미로에서 흰색 바탕은 길, 노란색 바탕은 벽을 나타낸다.

가장 좌상단에 있는 칸을 (0, 0)의 기준으로 하여, 가로방향을 x 방향, 세로방향을 y 방향이라고 할 때, 미로의 시작점은

 

(1, 1)이고 도착점은 (13, 13)이다.

주어진 미로의 출발점으로부터 도착지점까지 갈 수 있는 길이 있는지 판단하는 프로그램을 작성하라.

 

아래의 예시에서는 도달 가능하다.

 

 아래의 예시에서는 출발점이 (1, 1)이고, 도착점이 (11, 11)이며 도달이 불가능하다.


< ❓ 생각 >

미로문제에서 미로 크기만 바뀜
https://chaemi720.tistory.com/53

 

[SWEA] 4875. 미로 - Python

https://swexpertacademy.com/main/learn/course/lectureProblemViewer.do#none SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com < 📝 문제 >..

chaemi720.tistory.com

 

< 💻 코드 >

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
반응형

댓글