작성일 :

문제 링크

5566번 - 주사위 게임

설명

주사위를 던진 결과로 이동한 뒤 해당 칸의 지시만큼 한 번 더 이동합니다. 도착점 이상이면 종료되는 횟수를 찾는 문제입니다.


접근법

말의 위치를 1에서 시작해 주사위 눈만큼 이동합니다.

이동 후 위치가 N 이상이면 바로 종료하고, 그렇지 않으면 그 칸의 지시만큼 한 번 더 이동합니다.

이 과정을 순서대로 시뮬레이션하면 됩니다.


Code

C#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using System;

class Program {
  static void Main() {
    var first = Console.ReadLine()!.Split();
    var n = int.Parse(first[0]);
    var m = int.Parse(first[1]);

    var move = new int[n + 1];
    for (var i = 1; i <= n; i++)
      move[i] = int.Parse(Console.ReadLine()!);

    var pos = 1;
    for (var i = 0; i < m; i++) {
      var roll = int.Parse(Console.ReadLine()!);
      pos += roll;
      if (pos >= n) {
        Console.WriteLine(i + 1);
        return;
      }

      pos += move[pos];
      if (pos >= n) {
        Console.WriteLine(i + 1);
        return;
      }
    }
  }
}

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <bits/stdc++.h>
using namespace std;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int n, m; cin >> n >> m;
  vector<int> move(n + 1);
  for (int i = 1; i <= n; i++) cin >> move[i];

  int pos = 1;
  for (int i = 0; i < m; i++) {
    int roll; cin >> roll;
    pos += roll;
    if (pos >= n) {
      cout << i + 1 << "\n";
      return 0;
    }

    pos += move[pos];
    if (pos >= n) {
      cout << i + 1 << "\n";
      return 0;
    }
  }

  return 0;
}