알고리즘

[백준 알고리즘] 16173번 점프왕 쩰리. 파이썬(python)

삶은겨란 2022. 7. 14. 20:01

점프를 아래, 오른쪽으로만 할 수 있다고 해서 방문표시가 필요 없다고 생각했다.

현재 밟고 있는 칸에 쓰여진 숫자가 0이라면, 0만큼 이동하게 되어 제자리를 무한반복하게 된다.

따라서 방문 체크 리스트를 만들던가, 현재 밟고 있는 칸의 값이 0이 아니다를 조건으로 설정해 주어야 한다.

import sys
from collections import deque
input=sys.stdin.readline

n=int(input())
graph=[list(map(int,input().split())) for _ in range(n)]
dx=[1,0]
dy=[0,1]

def bfs(x,y):
    q=deque()
    q.append((x,y))

    while q:
        x,y=q.popleft()

        if graph[x][y]==-1: # 끝에 도착하면
            return 'HaruHaru'

        for i in range(2): # 현재 밟고 있는 숫자만큼 아래 또는 오른쪽으로 이동
            nx=x+dx[i]*graph[x][y]
            ny=y+dy[i]*graph[x][y]
        
            if 0<=nx<n and 0<=ny<n and graph[x][y]!=0: # 구역을 벗어나지 않고 밟고 있는 칸이 0이 아니면
                q.append((nx,ny))

    return 'Hing'

print(bfs(0,0)) # 출발은 무조건 왼쪽 제일 위

 

틀린답

import sys
from collections import deque
input=sys.stdin.readline

n=int(input())
graph=[list(map(int,input().split())) for _ in range(n)]
dx=[1,0]
dy=[0,1]

def bfs(x,y):
    q=deque()
    q.append((x,y))

    while q:
        x,y=q.popleft()

        if graph[x][y]==-1: # 끝에 도착하면
            return 'HaruHaru'

        for i in range(2): # 현재 밟고 있는 숫자만큼 아래 또는 오른쪽으로 이동
            nx=x+dx[i]*graph[x][y]
            ny=y+dy[i]*graph[x][y]
        
            if 0<=nx<n and 0<=ny<n:
                q.append((nx,ny))

    return 'Hing'

print(bfs(0,0)) # 출발은 무조건 왼쪽 제일 위

 

3
1 1 0
1 0 1
0 1 -1

틀린답 입력에 위 값을 넣어보면 (1,1) 위치에서 못 벗어나는 것을 확인할 수 있었다.