coding test

[파이썬] 1226. 미로1

잔망루피 2021. 3. 12. 15:46

※ SW Expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.

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

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

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

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

 

 

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

 

 

[입력]

각 테스트 케이스의 첫 번째 줄에는 테스트 케이스의 번호가 주어지며, 바로 다음 줄에 테스트 케이스가 주어진다.

총 10개의 테스트케이스가 주어진다.

테스트 케이스에서 1은 벽을 나타내며 0은 길, 2는 출발점, 3은 도착점을 나타낸다.

[출력]

#부호와 함께 테스트 케이스의 번호를 출력하고, 공백 문자 후 도달 가능 여부를 1 또는 0으로 표시한다 (1 - 가능함, 0 - 가능하지 않음).

 

입력

너무 길어서 생략.

직접 SW expert academy에서 찾기

 

출력

#1 1

#2 1

...

 

 

 

🎀 나의 풀이

def dfs(x, y):
    global temp
    temp=0
    
    if visited[x][y] == 0 and maze[x][y] != '1' :		# 방문한 적 없고 길 있으면
        if maze[x][y] == '3' :	# 도착
            return 1
        visited[x][y]=1			# 방문 처리
        # 4방향으로 재귀호출
        temp+=dfs(x-1, y)		
        temp+=dfs(x+1, y)
        temp+=dfs(x, y-1)
        temp+=dfs(x, y+1)  
        return temp
    else:
        return 0		# 미로 탈출 못 함
        
for test_case in range(10):		# 10개의 테스트 케이스
    T=input()		# 테스트 케이스 번호
    maze=[[1]*16 for _ in range(16)]	# 16*16 미로(0 : 길, 1 : 벽, 2 : 출발, 3 : 도착)
    visited=[[0]*16 for _ in range(16)]			# 방문기록 
    
    # 미로 입력
    for i in range(16) :
        string=input()
        for j in range(16) :
            maze[i][j]=string[j]
    #출발점
    start_X=1
    start_Y=1
    
    result=dfs(start_X, start_Y)	# 함수 호출
    print(f"#{T} {result}")

 

재귀호출로 구현했다.

 

 

다른사람 풀이

# 출처 : https://mungto.tistory.com/235

#이동리스트
move_list = [(1, 0), (-1, 0), (0, 1), (0, -1)]
 
def dfs(y, x):
    global result
    #현재 위치가 도착점이라면
    #목표점에 도달했거나 결과가 이미나와있다면 리턴
    if map_list[y][x] == 3 or result:
        result = 1
        return
    for i, j in move_list:
        d_y = y + i
        d_x = x + j
        #반복하다가 결과가 나왔다면 리턴
        if result: 
            return
        #벽이아니거나 왔던 위치가 아니라면
        if map_list[d_y][d_x] != 1 :
            #현재위치를 벽으로 체크하고 재귀
            map_list[y][x] = 1
            dfs(d_y, d_x)			# 재귀호출
        
 
T = 10
for _ in range(T):
    t = int(input())
    N = 16
    map_list = [list(map(int, list(input()))) for _ in range(N)]	# 미로
    result = 0
    #1,1 위치부터 탐색시작
    dfs(1,1)
    print('#{} {}'.format(t, result))

 

같은 dfs지만 방문 처리 리스트가 없다.

미로 만드는 부분이 한 줄로 깔끔하게 작성됨. 리스트 안에 N개의 int형 리스트를 담는다. 

 

# 출처 : https://mungto.tistory.com/235

from collections import deque

# 이동리스트
move_list=[(1, 0), (-1, 0), (0, 1), (0, -1)]

def bfs():
  queue=deque()
  queue.append((1, 1))
  map_list[1][1]=1
  while len(queue) :
    y, x = queue.popleft()
    if map_list[y][x] == 3 :
      return 1
    map_list[y][x]=1		# 방문 표시
    for i in move_list :
      my=i[0]+y
      mx=i[1]+x
      if 0 <= my < N and 0 <= mx < N and map_list[my][mx] != 1 :  # 인덱스 범위 체크와 통행 가능 여부
        queue.append((my, mx))
  return 0		# 도착 실패

for _ in range(10) :
  t=int(input())
  N=16
  map_list=[list(map(int, list(input()))) for _ in range(N)]
  # 1, 1 위치부터 탐색시작
  print('#{} {}'.format(t, bfs()))

 

큐를 이용해서 bfs로 구현함.

 

 

 

문제 출처 SW expert academy

반응형

'coding test' 카테고리의 다른 글

[파이썬] 1231. 중위순회  (0) 2021.03.16
[파이썬] BFS 해결하기  (0) 2021.03.15
[파이썬] 괄호 짝 판별  (0) 2021.03.09
[Python] 같은 번호 짝 소거하기  (0) 2021.03.09
[C] 패턴 매칭 해결하기  (0) 2021.03.04