작성일 :

문제 링크

16786번 - すごろくと駒 (Sugoroku and Pieces)

설명

1~2019번 칸에 N개의 말이 오름차순으로 놓여 있고, M번의 명령으로 지정된 말을 한 칸 앞으로 이동시킵니다.

말이 골에 있거나, 앞칸에 다른 말이 있으면 이동하지 않습니다.

모든 명령 후 각 말의 위치를 구하는 문제입니다.


접근법

말의 위치와 각 칸의 점유 여부를 관리합니다. 명령마다 해당 말이 골에 있지 않고 앞칸이 비어 있으면 한 칸 이동시키고 점유 상태를 갱신합니다.



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 parts = Console.In.ReadToEnd().Split((char[])null, StringSplitOptions.RemoveEmptyEntries);
    var idx = 0;
    var n = int.Parse(parts[idx++]);
    var pos = new int[n];
    var occ = new bool[2020];
    for (var i = 0; i < n; i++) {
      pos[i] = int.Parse(parts[idx++]);
      occ[pos[i]] = true;
    }

    var m = int.Parse(parts[idx++]);
    for (var i = 0; i < m; i++) {
      var a = int.Parse(parts[idx++]) - 1;
      var cur = pos[a];
      if (cur < 2019 && !occ[cur + 1]) {
        occ[cur] = false;
        occ[cur + 1] = true;
        pos[a] = cur + 1;
      }
    }

    for (var i = 0; i < n; i++)
      Console.WriteLine(pos[i]);
  }
}

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
30
31
32
33
34
#include <bits/stdc++.h>
using namespace std;

typedef vector<int> vi;
typedef vector<bool> vb;

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

  int n; cin >> n;
  vi pos(n);
  vb occ(2020, false);
  for (int i = 0; i < n; i++) {
    cin >> pos[i];
    occ[pos[i]] = true;
  }

  int m; cin >> m;
  for (int i = 0; i < m; i++) {
    int a; cin >> a; a--;
    int cur = pos[a];
    if (cur < 2019 && !occ[cur + 1]) {
      occ[cur] = false;
      occ[cur + 1] = true;
      pos[a] = cur + 1;
    }
  }

  for (int v : pos)
    cout << v << "\n";

  return 0;
}