Notice
Recent Posts
Recent Comments
Link
관리 메뉴

윤일무이

[JavaScript] 백준 코딩테스트 1158. 실버 4 : 요세푸스 문제 본문

⚙️ 코딩테스트

[JavaScript] 백준 코딩테스트 1158. 실버 4 : 요세푸스 문제

썸머몽 2023. 7. 31. 15:00
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