ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 11866 - 요세푸스 문제 0
    알고리즘 2023. 5. 30. 19:49
    728x90
    https://www.acmicpc.net/problem/11866
     

    11866번: 요세푸스 문제 0

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

    www.acmicpc.net

     

    문제요약

    • 1 부터 주어진 숫자까지의 숫자가 나열
    • 다음 주어진 숫자만큼 건너 뛰면서 해당 숫자를 제거하고 출력
    이전에 회전하는 큐와 비슷한 문제 접근으로 할 수 있다는 것을 알았다.
    왜냐면 3번째 숫자 전까지 옮겨주고, 3번째 숫자를 제거 한뒤 이를 기록하는 방식으로 접근했다면 쉬웠을 것이다.
    하지만, 해당 방법은 추후에 생각해 낸 것이고 현재는 규칙을 찾아 시도했다.

    1 2 3 4 5 6 7
    이라고 가정하면,
    1. 오른쪽으로 계속 진행하는 경우, 이경우는 제거 인덱스를 지속적으로 늘려주면된다.
    2. 오른쪽에서 다시 처음으로 돌아오는 경우, 이경우의 인덱스를 알아내는 작업이 필요했다.

    제거하는 인덱스의 경우, 건너뛰는 크기(step - 1) 씩한 인덱스이다.
    지워지는 숫자 끝 (지우는 인덱스)  +2씩 size
    3 2 7
    6 4 6
    2 6 % 5 = 1  ( 여기서 + 2 시작) 5
    7 3 4
    5 5 % 3 = 2 3
      4 % 2 = 0 2
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    import java.util.LinkedList;
    
    public class Main {
        public static void main(String[] args) throws IOException {
    
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            StringBuilder sb = new StringBuilder();
            LinkedList<Integer> dq = new LinkedList<>();
    
            String[] row = reader.readLine().split(" ");
            int repeat = Integer.parseInt(row[0]);
            int step = Integer.parseInt(row[1]);
    
            sb.append("<");
    
            // queue 만들기 1 2 3 4 5 6 7
            for (int i = repeat; i >= 1; i--) {
                dq.push(i);
            }
    
            int tempStep = 0;
    
            // repeat 수만큼 반복
            for (int i = 1; i <= repeat; i++) {
    
                if(i == repeat){
                    sb.append(dq.get(0));
                    break;
                }
    
                tempStep += step - 1;
                if(tempStep < dq.size()){
                    sb.append(dq.get(tempStep) + ", ");
                    dq.remove(dq.get(tempStep));
    
                } else {
                    tempStep = tempStep % dq.size();
                    sb.append(dq.get(tempStep) + ", ");
                    dq.remove(dq.get(tempStep));
                }
            }
            sb.append(">");
            System.out.println(sb);
        }
    }

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

    숫자야구  (0) 2023.06.15
    2798 - 블랙잭  (0) 2023.05.30
    11279 - 최대 힙  (0) 2023.05.30
    4949 - 균형잡힌 세상  (0) 2023.05.30
    9012 - 괄호  (0) 2023.05.26
Designed by Tistory.