[Python]백준_5566 : 주사위 게임

Alal11·2022년 12월 28일
0
post-thumbnail

출처

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


문제

상근이는 혼자 보드 게임을 하고 있다. 이 보드 게임의 보드는 N칸으로 이루어져 있고, 출발점은 1칸, 도착점은 N칸이다. 각 칸에는 지시 사항이 적혀있다. 지시 사항은 말을 얼만큼 이동해야 하는지가 쓰여 있다.

상근이는 도착점에 도착할 때까지 주사위를 굴려 나온 눈의 수만큼 그 칸으로 이동한다. 이때, 도착한 칸에 쓰여 있는 지시만큼 말을 다시 이동시킨다. 지시 사항으로 이동해서 도착한 칸에 쓰여 있는 지시는 따르지 않는다.

N칸에 도착했을 때와 그 칸을 넘는 경우도 도착한 것이다.

상근이가 던졌을 때 나온 주사위의 눈과 보드판의 지시사항이 주어졌을 때, 몇 번 만에 도착하는지 구하는 프로그램을 작성하시오.


입력

첫째 줄에 N과 M이 주어진다. M은 상근이가 주사위를 던진 횟수이다. (2 ≤ N ≤ 1000, 1 ≤ M ≤ 1000)

다음 N개 줄에는 -999이상 999이하의 정수가 하나씩 적혀있다. i번째 정수는 i번 칸에 쓰여 있는 지시사항 X이다. 이때, X가 0이면 아무것도 하지 않고 그 자리에 멈춰 있는다. X가 양수인 경우에는 X칸 더 앞으로 진행하는 것을, 음수인 경우에는 |X|칸 뒤로 진행하는 것을 나타낸다.

다음 M개 줄에는 1이상 6이하의 정수가 주어진다. j번째 정수는 상근이가 주사위를 j번째로 던졌을 때, 나온 눈이다.

1번 칸과 N번 칸에 쓰여 있는 지시사항은 항상 0이다. 또, 항상 주사위를 M번 이하로 던져서 도착할 수 있다. 또, 1보다 작은 칸으로 이동하라는 지시가 있는 경우도 없다.


출력

주사위를 몇 번 던져서 도착할 수 있는지 출력한다.


예제 입출력


알고리즘 분류

  • 구현
  • 시뮬레이션

➡️문제 분석

주사위를 굴린 수와 나온 눈의 수만큼 이동했을 때 도착한 칸에 있는 수를 구분하여 생각해준다.


➡️코드(⭕)

import sys
input = sys.stdin.readline

n, m = map(int, input().split())

board = []
dice = []
corrent = 0         # 현재 위치
move = 0            # 도착 칸에 있는 이동할 거리

for i in range(0, n):
    board.append(int(input()))

for j in range(0, m):
    dice.append(int(input()))


for k in range(1, m+1):
    corrent += dice[k-1]

    if corrent+1 >= n:
        print(k)
        break

    move = board[corrent]
    corrent += move

    if corrent+1 >= n:
        print(k)
        break

➡️코드 분석

  1. 보드 도착점 n칸과 주사위 던진 횟수 m을 입력받는다.

  2. n과 m만큼 각각 입력받아 board와 dice 리스트에 넣어준다.

  3. corrent는 현재 위치를 나타내고, move는 주사위를 굴렸을 때 도착 칸에 있는 이동할 거리를 나타낸다.

  4. 1부터 m번까지 반복하는데 주사위 dice 값 만큼 corrent에 더해주는데 만약, 도착점 n을 넘어서면 그대로 k를 출력하고 반복문 탈출한다.

  5. 아니라면 도착 칸의 이동할 위치 move를 corrent에 더해주고, 이 값이 다시 n을 넘어서면 반복문 빠져나온다.


➡️end

처음에 corrent와 move 변수의 의미가 조금 헷갈렸었지만 생각보다 재밌고 좋은 문제였다!

0개의 댓글