[ BOJ / Python ] 16173번 점프왕 쩰리(Small)

황승환·2022년 2월 8일
0

Python

목록 보기
159/498


이번 문제는 깊이우선탐색을 통해 해결하였다. 2가지 방향을 리스트로 관리하고 현재 위치의 값을 방향값에 곱하여 범위 내에 들어갈 수 있다면 재귀 호출을 하는 방식으로 접근하였고 쉽게 해결하였다.

  • dfs함수를 y, x를 인자로 갖도록 선언한다.
    -> answer를 global로 선언한다.
    -> 임시 변수 tmp에 board[y][x]를 저장한다.
    -> board[y][x]를 0으로 갱신한다.
    -> 2가지 방향에 대한 정보를 dy, dx에 짝지어 저장한다.
    -> 만약 y, x가 n-1일 경우, answer를 HaruHaru로 갱신하고 함수를 종료한다.
    -> 2번 반복하는 i에 대한 for문을 돌린다.
    --> ny를 y+(dy[i]*tmp)로 저장한다.
    --> nx를 x+(dx[i]*tmp)로 저장한다.
    --> 만약 ny, nx가 0보다 크거나 같고, n보다 작고, board[ny][nx]가 0이 아닐 경우, dfs(ny, nx)를 재귀호출한다.
  • n을 입력받는다.
  • board를 선언한다.
  • n번 반복하는 for문을 돌린다.
    -> board를 입력받는다.
  • answer를 Hing으로 선언한다.
  • dfs(0, 0)을 호출한다.
  • answer를 출력한다.

Code

def dfs(y, x):
    global answer
    tmp=board[y][x]
    board[y][x]=0
    dy=[0, 1]
    dx=[1, 0]
    if y==n-1 and x==n-1:
        answer='HaruHaru'
        return
    for i in range(2):
        ny=y+(dy[i]*tmp)
        nx=x+(dx[i]*tmp)
        if ny>=0 and nx>=0 and ny<n and nx<n and board[ny][nx]!=0:
            dfs(ny, nx)
n=int(input())
board=[]
for _ in range(n):
    board.append(list(map(int, input().split())))
answer='Hing'
dfs(0, 0)
print(answer)

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글