백준 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

  1. 초기에 문제 조건을 모호하게 이해해서 헤맸다. 칸에 적힌 숫자 만큼 한번에 이동한다는걸, 나눠서 이동 가능하다고 생각했기 때문이다.
  2. 첫 풀이에는 visitedList을 만들지 않고 그냥 탐색하도록 했는데, 메모리 초과 에러로 실패했다.
  3. exit(0)으로 -1인 위치에 도착하면 멈추도록 했다.
  4. exit()을 사용하지 않고 해결하려면 고수의 풀이를 참고하자. while문으로 queue가 존재하는동안 탐색하게 하고, while문이 끝나면 return ‘Hing’하면 깔끔하게 처리할 수 있다.