반응형

@notepad_jj2

츄르사려고 코딩하는 코집사입니다.


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

1) 문제번호 : 16173번

 

2) 문제 출처

https://www.acmicpc.net/problem/16173

 

16173번: 점프왕 쩰리 (Small)

쩰리는 맨 왼쪽 위의 칸에서 출발해 (행, 열)로 나타낸 좌표계로,  (1, 1) -> (2, 1) -> (3, 1) -> (3, 3)으로 이동해 게임에서 승리할 수 있다.

www.acmicpc.net

 

2. 문제

‘쩰리’는 점프하는 것을 좋아하는 젤리다. 단순히 점프하는 것에 지루함을 느낀 ‘쩰리’는 새로운 점프 게임을 해보고 싶어 한다. 새로운 점프 게임의 조건은 다음과 같다.

  1. ‘쩰리’는 가로와 세로의 칸 수가 같은 정사각형의 구역 내부에서만 움직일 수 있다. ‘쩰리’가 정사각형 구역의 외부로 나가는 경우엔 바닥으로 떨어져 즉시 게임에서 패배하게 된다.
  2. ‘쩰리’의 출발점은 항상 정사각형의 가장 왼쪽, 가장 위의 칸이다. 다른 출발점에서는 출발하지 않는다.
  3. ‘쩰리’가 이동 가능한 방향은 오른쪽과 아래 뿐이다. 위쪽과 왼쪽으로는 이동할 수 없다.
  4. ‘쩰리’가 가장 오른쪽, 가장 아래 칸에 도달하는 순간, 그 즉시 ‘쩰리’의 승리로 게임은 종료된다.
  5. ‘쩰리’가 한 번에 이동할 수 있는 칸의 수는, 현재 밟고 있는 칸에 쓰여 있는 수 만큼이다. 칸에 쓰여 있는 수 초과나 그 미만으로 이동할 수 없다.

새로운 게임이 맘에 든 ‘쩰리’는, 계속 게임을 진행해 마침내 최종 단계에 도달했다. 하지만, 게임을 진행하는 구역이 너무 넓어져버린 나머지, 이 게임에서 이길 수 있는지 없는지 가늠할 수 없어졌다. ‘쩰리’는 유능한 프로그래머인 당신에게 주어진 구역에서 승리할 수 있는 지 알아봐 달라고 부탁했다. ‘쩰리’를 도와 주어진 게임 구역에서 끝 점(오른쪽 맨 아래 칸)까지 도달할 수 있는지를 알아보자!

 

3. 제약사항


4. 입력

입력의 첫 번째 줄에는 게임 구역의 크기 N (2 ≤ N ≤ 3)이 주어진다.

입력의 두 번째 줄부터 마지막 줄까지 게임판의 구역(맵)이 주어진다.

게임판의 승리 지점(오른쪽 맨 아래 칸)에는 -1이 쓰여있고, 나머지 칸에는 0 이상 100 이하의 정수가 쓰여있다.

 

5. 출력

‘쩰리’가 끝 점에 도달할 수 있으면 “HaruHaru”(인용부호 없이), 도달할 수 없으면 “Hing” (인용부호 없이)을 한 줄에 출력합니다.

 

6. 풀이

- 간단한 BFS 문제이다.

- 방문 배열을 만들어서, BFS를 돌리면 되는데 문제에서 위와 왼쪽을 갈 수 없다고 했으니 오른쪽과 아래로에 대한 방향을 설정하여 BFS를 돌리면 된다.

- 그래서, 이동하다가 방문 했으면 HaruHaru를 출력하고 끝내면 되고, 그게 아니라면 Hing을 출력한다.

- 좌표에 대한 이동은 기존 x값에 점프값과 방향을 곱하여 이동하면 된다.

 

7. 소스 코드

import sys
input=sys.stdin.readline

N = int(input()) # 게임구역크기 N

board = []

for _ in range(N) :
    board.append(list(map(int, input().split())))

#방문체크
visit = [[0] * N for _ in range(N)]

queue = [[0,0]]

#하, 우
dx = [1,0]
dy = [0,1]

#BFS
while queue :
    x, y = queue[0][0], queue[0][1]
    del queue[0]

    # 맨 오른쪽 아래 도달하면 HaruHaru 출력
    if board[x][y]==-1 :
        print("HaruHaru")
        exit(0)

    # 점프값
    jump = board[x][y]

    #아래, 오른쪽 탐색
    for i in range(2) :
        nx = x + dx[i] * jump
        ny = y + dy[i] * jump

        # 범위 안에 있고, 방문하지 않았으면 방문 체크 후 queue에 넣기
        if 0<=nx<N and 0<=ny<N and visit[nx][ny]==0 :
            visit[nx][ny] = 1
            queue.append([nx,ny])


print("Hing")

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기