https://www.acmicpc.net/problem/1835
문제
1부터 N까지의 숫자가 적힌 카드가 있다. 찬유는 이 카드를 가지고 마술을 하려 한다. 마술을 하는 순서는 다음과 같다.
- 먼저 1부터 N까지의 숫자가 적힌 카드에서 첫 번째 카드를 가장 뒤로 옮긴다. 그러고 나서 첫 번째 카드를 책상 위에 올려놓는다. 그런데 그 카드는 1이 되어야 한다.
- 그리고 남은 카드 중에서 첫 번째 카드를 가장 뒤로 옮기고, 또 가장 앞에 있는 카드를 가장 뒤로 옮긴다.(2번 반복) 그리고 가장 앞에 있는 카드를 책상 위에 올려놓는다. 그런데 그 카드는 2가 되어야 한다.
- 또 남은 카드 중에서 첫 번째 카드를 가장 뒤로 옮기고... (3번 반복) 그리고 가장 앞에 있는 카드를 책상위에 올려놓는데 그것은 3이 된다.
- 또 남은 카드 중에서 첫 번째 카드를 가장 뒤로 옮기고.. (4번 반복) 그리고 가장 앞에 있는 카드를 책상 위에 올려놓는데 그것은 4이다.
- 위 과정을 계속 반복하여 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(" "));
'Algorithm' 카테고리의 다른 글
[Baekjoon]11899번 괄호 끼워넣기 - Javascript (0) | 2024.02.28 |
---|---|
[Baekjoon]17254번 키보드 이벤트 - Javascript (1) | 2024.02.27 |
[Baekjoon]1590번 캠프가는 영식 - Javascript (0) | 2024.02.23 |
[Baekjoon]14381번 숫자세는 양 (Small) - Javascript (0) | 2024.02.22 |
[Baekjoon]29700번 우당탕탕 영화예매 - Javascript (0) | 2024.02.20 |