백준 16173번 바로가기
나의 풀이#
import sys
sys.setrecursionlimit(10**6)
n = int(input())
maps = []
for i in range(n):
lines = map(int,input().split())
maps.append(list(lines))
visited = [[False] * n for _ in range(n)]
def dfs(x,y):
if not 0<=x<n or not 0<=y<n:
return
l = maps[y][x]
if l == -1:
print("HaruHaru")
exit(0)
if not visited[y][x]:
visited[y][x] = True
dfs(x+l,y)
dfs(x,y+l)
return
dfs(0,0)
print("Hing")
고수의 풀이#
import sys
from collections import deque
def solution(N, graph):
visited = [[False] * N for _ in range(N)]
dx = [1, 0]
dy = [0, 1]
def dfs(x, y, visited):
queue = deque()
queue.append((x, y))
while queue:
x, y = queue.popleft()
if graph[x][y] == -1:
return 'HaruHaru'
jump = graph[x][y] # 점프 값
for i in range(2):
nx = x + dx[i] * jump
ny = y + dy[i] * jump
if nx >= N or ny >= N:
continue
if visited[nx][ny]:
continue
else:
visited[nx][ny] = True
queue.append((nx, ny))
return 'Hing'
print(dfs(0, 0, visited))
if __name__ == "__main__":
N = int(sys.stdin.readline())
graph = [list(map(int, sys.stdin.readline().split())) for _ in range(N)]
solution(N, graph)
출처
CODE REVIEW#
- 초기에 문제 조건을 모호하게 이해해서 헤맸다. 칸에 적힌 숫자 만큼
한번에
이동한다는걸, 나눠서 이동 가능하다고 생각했기 때문이다.
- 첫 풀이에는 visitedList을 만들지 않고 그냥 탐색하도록 했는데,
메모리 초과
에러로 실패했다.
exit(0)
으로 -1인 위치에 도착하면 멈추도록 했다.
- exit()을 사용하지 않고 해결하려면 고수의 풀이를 참고하자.
while문
으로 queue가 존재하는동안 탐색하게 하고, while문이 끝나면 return ‘Hing’하면 깔끔하게 처리할 수 있다.