Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Tags
more
Archives
Today
Total
관리 메뉴

forDevLife

[백준] 11866 - 요세푸스 문제 0 본문

알고리즘

[백준] 11866 - 요세푸스 문제 0

JH_Lucid 2021. 6. 17. 15:43

처음에는 그냥 단순히 큐로 구현했다. 역시나 풀리긴 하지만 시간 / 메모리를 좀 먹는 편.

 

아래는 큐가 아닌 LinkedList로 구현한 방법이다.

idx가 움직이는 것을 다음과 같이 설명할 수 있다.

1. idx에 처음에 K-1만큼 더해준다. 우선 배열은 하나가 사라지면, 그 다음 걸 가리키게 되므로 한칸 내려서 더해준다. -1하지 않으면 원래 탐색 대상은 넘어가 버린다.

2. %= 연산을 통해 마치 실제로 큐에 계속 데이터를 넣는 것처럼 구현할 수 있다.

import java.io.*;
import java.util.*;
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer stk = new StringTokenizer(br.readLine());
        StringBuilder sb = new StringBuilder();
        List<Integer> Q = new LinkedList<>();

        int N = Integer.parseInt(stk.nextToken());
        int K = Integer.parseInt(stk.nextToken());

        for(int i = 1; i <= N; i++) {
            Q.add(i);
        }

        int idx = 0;
        sb.append("<");
        while(!Q.isEmpty()) {
            idx += K-1;
            if(idx >= Q.size()) {
                idx %= Q.size();
            }
            if(Q.size() != 1) {
                sb.append(Q.remove(idx) + ", ");
            } else
                sb.append(Q.remove(idx) + ">");
        }
        System.out.println(sb);
    }
}

'알고리즘' 카테고리의 다른 글

[백준] 2805 - 나무 자르기  (0) 2021.06.17
[백준] 18111 - 마인크래프트  (0) 2021.06.17
[백준] 2798 - 블랙잭  (0) 2021.06.16
[백준] 2609 - 최대공약수와 최소공배수  (0) 2021.06.16
[백준] 1978 - 소수 찾기  (0) 2021.06.15
Comments