Algorithm

[Baekjoon]1835번 카드 - Javascript

호밀이 2024. 2. 26. 23:12

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

 

1835번: 카드

첫 번째 줄에 카드의 개수 N(1 ≤ N ≤ 1,000)이 주어진다.

www.acmicpc.net

문제

1부터 N까지의 숫자가 적힌 카드가 있다. 찬유는 이 카드를 가지고 마술을 하려 한다. 마술을 하는 순서는 다음과 같다.

  1. 먼저 1부터 N까지의 숫자가 적힌 카드에서 첫 번째 카드를 가장 뒤로 옮긴다. 그러고 나서 첫 번째 카드를 책상 위에 올려놓는다. 그런데 그 카드는 1이 되어야 한다.
  2. 그리고 남은 카드 중에서 첫 번째 카드를 가장 뒤로 옮기고, 또 가장 앞에 있는 카드를 가장 뒤로 옮긴다.(2번 반복) 그리고 가장 앞에 있는 카드를 책상 위에 올려놓는다. 그런데 그 카드는 2가 되어야 한다.
  3. 또 남은 카드 중에서 첫 번째 카드를 가장 뒤로 옮기고... (3번 반복) 그리고 가장 앞에 있는 카드를 책상위에 올려놓는데 그것은 3이 된다.
  4. 또 남은 카드 중에서 첫 번째 카드를 가장 뒤로 옮기고.. (4번 반복) 그리고 가장 앞에 있는 카드를 책상 위에 올려놓는데 그것은 4이다.
  5. 위 과정을 계속 반복하여 N번 카드만 남을 때 까지 반복한다.

위와 같은 카드를 하려면 미리 카드의 순서를 알고 있어야 한다. 카드의 개수 N이 주어져 있을 때 위의 마술을 하기 위한 카드의 초기 순서를 구하는 프로그램을 작성하시오.

입력

첫 번째 줄에 카드의 개수 N(1 ≤ N ≤ 1,000)이 주어진다.

출력

첫 번째 줄부터 N번째 줄까지 차례로 카드의 순서를 출력한다.

예제 입력 1 복사

4

예제 출력 1 복사

2 1 4 3

 

문제풀이(1)

문제에 나와있는 방식을 반대로 진행하면 초기 카드의 세팅값을 찾을 수 있다.
1. N 번 카드가 있다. (N = 4)
2. N - 1, N번의 카드가 있다. 가장 뒤에 있는 카드를 가장 앞으로 옮긴다.(N회 반복)
   [3, 4] -> [4, 3] -> [3, 4] -> [4, 3]
3. [4, 3]의 카드 배열에 N - 2를 맨 앞에 추가한다. 가장 뒤에 있는 카드를 가장 앞으로 옮긴다.(N - 1회 반복)
   [2, 4, 3] -> [3, 2, 4] -> [4, 3, 2]
4. [4, 3, 2]의 카드 배열에 N - 3을 맨 앞에 추가한다. 가장 뒤에 있는 카드를 가장 앞으로 옮긴다.(N - 2회 반복)
   [1, 4, 3, 2] -> [2, 1, 4, 3]
5. 마지막으로 추가된 배열[2, 1, 4, 3]을 출력한다.

const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
const N = Number(require("fs").readFileSync(filePath).toString().trim());

// N번 카드 추가
const arr = [N];

// N - 1부터 1까지 반복
for (let i = N - 1; i > 0; i--) {
  // i번째 값을 배열의 첫번째에 추가한다.
  arr.unshift(i);

  // i번 만큼 순회한다.
  for (let j = 0; j < i; j++) {
    // 마지막 카드를 추출한다.
    const lastCard = arr.pop();
    // 마지막 카드를 맨앞으로 옮긴다.
    arr.unshift(lastCard);
  }
}

console.log(arr.join(" "));