[158]ジョセフス問題|白駿銀色4
🔎 問題の説明
質問リンク
ジョセフス問題は以下の通りです.
1番からN番までは、N人が1つの円に座り、正の整数K(≦N)を与えます.今は順番にK人目を除いています.一人が取り除かれると、残りの人からなる円に沿ってこの過程が続きます.この過程はN人全員がクリアされるまで続く.円上の人々が消去される順序を(N,K)−ジョセフス配列と呼ぶ.例えば、(7,3)−ジョセフス配列<3,6,2,7,5,1,4>である.
NとKをあげると(N,K)-ジョセフスシーケンスを求めるプログラムを書きます.
入力
第1行NとKは、スペースを隔てて順次与えられる.
しゅつりょく
ジョセフスシーケンスを出力します.
せいげんじょうけん
🧪 JAvaコード
import java.io.*;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class Josephus {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
//(1 ≤ K ≤ N ≤ 5,000)
String[] cmd = br.readLine().split(" ");
int N = Integer.parseInt(cmd[0]);
int K = Integer.parseInt(cmd[1]);
//1부터N까지 들어있는 리스트 생성 //boxed : int -> integer
List<Integer> Q = IntStream.range(1,N+1).boxed().collect(Collectors.toList());
for (int i = -1; 0 < N; i--) {//i = Q의 index번호라 1씩 빼줌
Q.add(Q.remove(i = (i + K) % N--));
}
//리스트에 구분자 ", "넣고 스트링으로 반환
bw.write("<"+Q.stream().map(String::valueOf).collect(Collectors.joining(", "))+">");
bw.flush();
bw.close();
}
}
Streamで解いたStreamとStringBuilderを使用しないメモリ/時間効率は同等です.でも銀4じゃないみたい銀色にしたい
🧊 Pythonコード
from collections import deque
N, K = map(int, input().split()) # (1 ≤ K ≤ N ≤ 5,000)
Q, res = deque([*range(N)]), [] # Q = [0...N-1] , res = []
while Q:
Q.rotate(-K+1) # Q회전
res.append(Q.popleft()+1) #Q맨앞요소 res로 push
print('<'+str(res)[1:-1]+'>')
Pythonはrotate()を考慮して論理を容易に思いついた.Reference
この問題について([158]ジョセフス問題|白駿銀色4), 我々は、より多くの情報をここで見つけました https://velog.io/@yoongyum/1158-요세푸스-문제-백준-실버-4テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol