새소식

250x250
알고리즘 분류/자료구조

[BJ]11866, 1158, 1168, 11025 요세푸스 문제 n

  • -
728x90

BJ 11866, 1158, 1168, 11025 요세푸스 문제 n

 

 

문제링크

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

 

11866번: 요세푸스 문제 0

첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 1,000)

www.acmicpc.net

 

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

 

1158번: 요세푸스 문제

첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)

www.acmicpc.net

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

 

1168번: 요세푸스 문제 2

첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 100,000)

www.acmicpc.net

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

 

11025번: 요세푸스 문제 3

첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000,000)

www.acmicpc.net

 

* 일단 문제를 정독 하고 1시간 이상 반드시 고민이 필요합니다.

 

동영상 설명

1시간 이상 고민 했지만 아이디어가 떠오르지 않는다면 동영상에서 약간의 힌트를 얻어봅시다.

 

소스보기

동영상 설명을 보고도 전혀 구현이 안된다면 연습 부족입니다.
소스를 보고 작성해 본 후 스스로 백지 상태에서 3번 작성해 볼 의지가 있다면 소스를 살짝 보세요.

더보기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.StringTokenizer;

/**
 * @author 은서파
 * @since 2023/08/15
 * @see https://www.acmicpc.net/problem/11866
 * @git 
 * @youtube  
 * @performance 12988	116
 * @category #자료구조, #Queue
 * @note 
 */

public class BJ_S5_11866_요세푸스문제_0{
    private static BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
    private static StringBuilder output = new StringBuilder();
    private static StringTokenizer tokens;

    private static int N, K;
    private static Queue<Integer> queue;
    public static void main(String[] args) throws IOException {
        input = new BufferedReader(new StringReader(instr));
        tokens = new StringTokenizer(input.readLine());
        N = Integer.parseInt(tokens.nextToken());
        K = Integer.parseInt(tokens.nextToken());

        queue = new ArrayDeque<>();
        for(int i=1; i<=N; i++){
            queue.offer(i);
        }
        output.append("<");
        for(; !queue.isEmpty();){
            // K-1번째 까지는 빼서 뒤로 이동
            for(int k=0; k<K-1; k++){
                queue.offer(queue.poll());
            }
            // K 번째는 제거
            output.append(queue.poll()).append(", ");
        }
        output.delete(output.length()-2, output.length()).append(">");
        System.out.println(output);
    }

    // REMOVE_START
    private static String instr = "7 3";
    // REMOVE_END
}



import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import java.util.StringTokenizer;

/**
 * @author 은서파
 * @since 2023/08/15
 * @see https://www.acmicpc.net/problem/1158
 * @git 
 * @youtube  
 * @performance 12296	108
 * @category #자료구조, #List
 * @note 
 */

public class BJ_S4_01168_요세푸스문제{
    private static BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
    private static StringBuilder output = new StringBuilder();
    private static StringTokenizer tokens;

    private static int N, K;
    private static List<Integer> list; // index로 접근하기 위해서.
    public static void main(String[] args) throws IOException {
        input = new BufferedReader(new StringReader(instr));
        tokens = new StringTokenizer(input.readLine());
        N = Integer.parseInt(tokens.nextToken());
        K = Integer.parseInt(tokens.nextToken());
        list = new ArrayList<>();
        for(int n=1; n<=N; n++){
            list.add(n);
        }
        output.append("<");
        for(int n=0, target=0, size=N; n<N; n++, size--){
            target = (target + K-1) %size;
            output.append(list.remove(target)).append(", ");
        }
        output.delete(output.length()-2, output.length()).append(">");
        System.out.println(output);
    }

    // REMOVE_START
    private static String instr = "7 3";
    // REMOVE_END
}



import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import java.util.StringTokenizer;

/**
 * @author 은서파
 * @since 2023/08/15
 * @see https://www.acmicpc.net/problem/1168
 * @git 
 * @youtube  
 * @performance 20288	236
 * @category #자료구조, #세그먼트트리
 * @note 
 */

public class BJ_P3_01168_요세푸스문제_2{
    private static BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
    private static StringBuilder output = new StringBuilder();
    private static StringTokenizer tokens;

    private static int N, K;
    private static SegmentTree tree;
    public static void main(String[] args) throws IOException {
        input = new BufferedReader(new StringReader(instr));
        tokens = new StringTokenizer(input.readLine());
        N = Integer.parseInt(tokens.nextToken());
        K = Integer.parseInt(tokens.nextToken());

        tree = new SegmentTree(N);
        output.append("<");
        for(int n=0, target = 0, size=N; n<N; n++, size--){
            target = (target + K-1) %size;
            int orgNum = tree.find(1, 1, N, target+1);
            output.append(orgNum).append(", ");
        }
        output.delete(output.length()-2, output.length()).append(">");
        System.out.println(output);
    }

    static class SegmentTree{
        int [] data;

        public SegmentTree(int size){
            // 2^h = size;
            int h = (int)Math.ceil( Math.log(size) / Math.log(2));
            data = new int[(int)Math.pow(2, h+1)];
            init(1, 1, N);
        }

        private int init(int node, int s, int e){
            // 시작의 번호와 끝의 번호가 같다면 = 1
            if(s==e){
                return data[node] = 1;
            }
            // 나머지는 절반씩 나눠서 왼쪽 노드, 오른쪽 노드로 구분 초기화 - 값을 합쳐서 반환
            else{
                int mid = (s +e)/2;
                return data[node] = init(node*2, s, mid) + init(node*2+1, mid+1, e);
            }
        }

        private int find(int node, int s, int e, int order){
            // 방문한 노드들은 1씩 감소
            data[node]--;
            if(s==e){
                return s;
            }else{
                int mid = (s+e)/2;
                // 왼쪽에 내가 죽일 대상이 있나?
                if(data[node*2]>=order){
                    return find(node*2, s, mid, order);
                }else{
                    return find(node*2+1, mid+1, e, order - data[node*2]);
                }
            }
        }
    }
    // REMOVE_START
    private static String instr = "7 3";
    // REMOVE_END
}



import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import java.util.StringTokenizer;

/**
 * @author 은서파
 * @since 2023/08/15
 * @see https://www.acmicpc.net/problem/1168
 * @git 
 * @youtube  
 * @performance 11784	128
 * @category #DP
 * @note 
 */

public class BJ_P5_11025_요세푸스문제_3{
    private static BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
    private static StringBuilder output = new StringBuilder();
    private static StringTokenizer tokens;

    private static int N, K;
    public static void main(String[] args) throws IOException {
        input = new BufferedReader(new StringReader(instr));
        tokens = new StringTokenizer(input.readLine());
        N = Integer.parseInt(tokens.nextToken());
        K = Integer.parseInt(tokens.nextToken());

        int A = 1;
        for(int n=2; n<=N; n++){
            A = (A + K-1)%n+1;
        }
        System.out.println(A);

    }

    
    // REMOVE_START
    private static String instr = "7 3";
    // REMOVE_END
}

 

728x90

'알고리즘 분류 > 자료구조' 카테고리의 다른 글

[자료구조]Deque  (0) 2023.02.12
[BJ]1202. 보석도둑  (0) 2023.01.15
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.