728x90
📌 문제
요세푸스 문제는 다음과 같다.
1번부터 N번까지 N명의 사람이 원을 이루면서 앉아있고, 양의 정수 K(≤ N)가 주어진다. 이제 순서대로 K번째 사람을 제거한다. 한 사람이 제거되면 남은 사람들로 이루어진 원을 따라 이 과정을 계속해 나간다. 이 과정은 N명의 사람이 모두 제거될 때까지 계속된다. 원에서 사람들이 제거되는 순서를 (N, K)-요세푸스 순열이라고 한다. 예를 들어 (7, 3)-요세푸스 순열은 <3, 6, 2, 7, 5, 1, 4>이다.
N과 K가 주어지면 (N, K)-요세푸스 순열을 구하는 프로그램을 작성하시오.
📌 입력
첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)
📌 출력
예제와 같이 요세푸스 순열을 출력한다.
📌 예제 입출력
📌 풀이
알아야 하는 것
- 큐
- 먼저 들어온 게 먼저 나간다.
구할 것
- people 배열이 다 빌 때까지 삭제를 진행한다.
- 먼저 처음에는 idx가 0이므로 target-1 = 2가 되어 2 % 7 === 2라서 people[2]인 3이 answer에 push된다.
- 한 후에 해당 값을 잘라낸다.
- 그리고 그 값에서부터 target-1을 추가하면서 그 값을 기준으로 target만큼 앞으로 전진한다.
- 즉 idx가 2인 상황에서 다음 값은 2+2 === 4이고, 4 % 6으로 4가 되어 6이 answer에 push된 후 삭제된다.
- 다음은 idx가 4인 상황에서 4+2 === 6이고, 6 % 5로 1이 되어 people[1]인 2가 ansewr에 push된 후 삭제된다.
- 이렇게 진행하다 보면 people의 길이가 0과 같아지고 종료하게 된다.
- 출력 값이 특이한데, [3, 6, 2, 7, 5, 1, 4]를 ", "를 구분자로 join한다. 3, 6, 2, 7, 5, 1, 4를 꺽쇠 안에 넣어주면 된다.
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "input.txt";
let input = fs.readFileSync(filePath).toString().trim();
let [num, target] = input.split(" ").map(Number);
let people = [];
let answer = [];
for (let i = 1; i <= num; i++) {
people.push(i);
}
let idx = 0;
while (people.length > 0) {
idx = (idx + target - 1) % people.length;
answer.push(people[idx]);
people.splice(idx, 1);
}
console.log(`<${answer.join(", ")}>`);
728x90
'⚙️ 코딩테스트' 카테고리의 다른 글
[JavaScript] 프로그래머스 코딩테스트 레벨 2 : 숫자의 표현 (0) | 2023.08.10 |
---|---|
[JavaScript] 프로그래머스 코딩테스트 레벨 2 : 게임 맵 최단거리 (0) | 2023.08.08 |
[JavaScript] 백준 코딩테스트 10866. 실버 4 : 덱 (0) | 2023.07.31 |
[JavaScript] 백준 코딩테스트 8978. 실버 5 : 올림픽 (0) | 2023.07.28 |
[JavaScript] 백준 코딩테스트 25206. 실버 5 : 너의 평점은 (0) | 2023.07.27 |