반응형
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
- 문제
입구와 출구가 주어지고 0으로 길이 나있으면 이 길을 따라가면 출구에 도착할 수 있는지 여부를 확인하는 문제다.
- 풀이
def bfs(x, y):
check = 0
temp = [[x, y]] # 시작지점을 temp에 넣고
visited[x][y] = 1 # 시작지점의 방문여부 True
while True:
i, j = temp.pop() # 스택이라고 생각하고 FILO(First in last out)
for dir in range(4): # 상하좌우 네 가지 방향에 따라 반복
ni = i + directionX[dir]
nj = j + directionY[dir]
if 0 <= ni < 16 and 0 <= nj < 16: # maze의 크기를 벗어나지 않도록
if maze[ni][nj] == 0 and visited[ni][nj] == 0: # 방문한적이 없고 길이 있으면 해당 길을 temp에 저장
temp.append([ni, nj])
visited[ni][nj] = 1
elif maze[ni][nj] == 3: # 출구면 break
check = 1
break
if check == 1 or len(temp) == 0:
break
return check
directionX = [-1, 1, 0, 0]
directionY = [0, 0, -1, 1]
for t in range(10): # 여기가 시작점
nothing = input() # 필요없는 숫자 하나 입력받아주고
maze = [list(map(int, input()))for _ in range(16)] # 16줄의 미로를 maze에 저장
visited = [[0]*16 for _ in range(16)] # 방문 여부도 16*16으로 만들기
x = -1 # 시작지점 찾기
y = -1
for i in range(16):
for j in range(16):
if maze[i][j] == 2:
x = i
y = j
break
if x != -1:
break
answer = bfs(x, y) # 너비우선탐색 시작
print("#{} {}".format(t+1, answer))
BFS(너비우선탐색)와 DFS(깊이우선탐색)의 두가지 방법으로 문제를 해결할 수 있지만, 재귀함수로 만들지 않고 풀기에는 BFS가 더 편하므로 BFS로 문제를 풀어보았다.
temp라는 임의로 만든 스택(리스트이지만, 스택이라고 생각해서 pop을 해야 시간복잡도가 적다)이 비어버릴 때까지 미로를 탐색하다가 temp가 비어버리거나 출구를 찾았을 때 끝내도록 하였다.
- 기억할 것!
maze = [list(map(int, input()))for _ in range(16)]
위와 같은 방식으로 16줄의 입력을 받을 수 있다!
반응형
'Algorithm > SW Expert Academy' 카테고리의 다른 글
SWEA 1227 : 미로2(S/W 문제해결 기본)[파이썬] (0) | 2022.05.31 |
---|---|
SWEA 2005 : 파스칼의 삼각형(D2)[파이썬] (0) | 2022.05.26 |
SWEA 2063 : 중간값 찾기(D1)[파이썬] (0) | 2022.05.25 |
SWEA 1926 : 간단한 369게임(D2)[파이썬] (0) | 2022.05.13 |
SWEA 2071 : 평균값 구하기(모의 SW D1)[파이썬] (0) | 2022.05.10 |