본문 바로가기

OJ

[BOJ] 20301 반전 요세푸스 (JAVA)

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

 

20301번: 반전 요세푸스

첫째 줄에 정수 $N$, $K$, $M$이 주어진다. ($1 \leq N \leq 5\ 000$, $1 \leq K, M \leq N$)

www.acmicpc.net

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args) throws Exception {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        int N = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        Deque<Integer> dq = new ArrayDeque<>();
        for (int i = 1; i <= N; i++) {
            dq.offer(i);
        }

        boolean forward = true;
        int kCnt = 0;
        int mCnt = 0;

        while (!dq.isEmpty()) {
            if (++kCnt < K) {
                if (forward) dq.offerLast(dq.pollFirst());
                else dq.offerFirst(dq.pollLast());
            } else {
                kCnt = 0;
                sb.append(dq.pollFirst()).append("\n");
                if (++mCnt == M) {
                    mCnt = 0;
                    forward = !forward;
                }
                if (!forward && dq.size() != 0) dq.offerFirst(dq.pollLast());
            }
        }

        System.out.print(sb);

    }
	
}