작성일 :

문제 링크

10804번 - 카드 역배치

설명

1부터 20까지 순서대로 놓인 카드들에 대해 총 10번에 걸쳐 특정 구간 [a, b]를 선택하여 해당 부분을 뒤집는 작업을 반복한 뒤,

최종 카드 상태를 출력하는 시뮬레이션 문제입니다.


각 구간의 시작과 끝은 항상 1 ≤ a ≤ b ≤ 20을 만족하며,

각 작업은 입력 순서대로 적용됩니다.


접근법

  • 먼저 카드 배열을 1부터 20까지 초기화합니다.
  • 10번 반복하여 시작 위치와 끝 위치를 입력받습니다.
  • 각 구간이 주어질 때마다, 해당 범위 내의 카드 순서를 현재 순서의 반대가 되도록 뒤집습니다.
  • 반복이 모두 끝나면, 카드 배열을 공백 구분자로 출력합니다.



Code

C#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System;
using System.Linq;

class Program {
  static void Main() {
    var cards = Enumerable.Range(1, 20).ToList();

    for (int i = 0; i < 10; i++) {
      var input = Console.ReadLine().Split().Select(int.Parse).ToArray();
      int a = input[0] - 1, b = input[1] - 1;
      cards.Reverse(a, b - a + 1);
    }

    Console.WriteLine(string.Join(" ", cards));
  }
}


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

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

  int card[20];
  for (int i = 0; i < 20; i++)
    card[i] = i + 1;

  for (int i = 0; i < 10; i++) {
    int idxB, idxE; cin >> idxB >> idxE;
    reverse(&card[idxB - 1], &card[idxE]);
  }

  for (int i = 0; i < 20; i++) {
    cout << card[i];
    if (i != 19) cout << " ";
    else cout << "\n";
  }

  return 0;
}