백준

[백준 11866] 요세푸스 문제 0 JAVA - 원형 Queue 사용

오은이 2024. 11. 12. 16:08

 

 

 

 

 


 

 

 

 

 

 

작성 코드

import java.util.Scanner;
import java.util.LinkedList;
import java.util.Queue;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        int n = sc.nextInt();
        int k = sc.nextInt();
        
        Queue<Integer> que = new LinkedList<>();
        
        for (int i = 1; i <= n; i++) {
            que.offer(i);
        }

        StringBuilder sb = new StringBuilder();
        sb.append("<");
        
        while (!que.isEmpty()) {
            for (int i = 1; i < k; i++) {
                que.offer(que.poll());
            }
            sb.append(que.poll());
            
            if (!que.isEmpty()) {
                sb.append(", ");
            }
        }
        sb.append(">");
        
        System.out.println(sb.toString());
    }
}

 

 

 

 

 

 

    StringBuilder sb = new StringBuilder();
    sb.append("<");
StringBuilder
자바에서 문자열을 효율적으로 다루기 위한 클래스
문자열을 자주 변경하거나 수정해야 할 경우, StringBuilder를 사용하는 것이 성능 면에서 유리

 

결과를 담을 StringBuilder 선언 후 "<" 추가

 

 

 

 

    while (!que.isEmpty()) {
        // 큐에서 k-1번만큼 앞의 사람들을 뒤로 보내기
        for (int i = 1; i < k; i++) {
            que.offer(que.poll());
        }

        // k번째 사람을 제거하고 sb에 넣기
        sb.append(que.poll());

        // 큐에 다음 사람이 남아있으면 ", " 추가
        if (!que.isEmpty()) {
            sb.append(", ");
        }
    }

 

큐가 비어있지 않은 동안, while문을 반복한다.입력값이 7 3 일 때 k는 3이므로, for문은 k-1인 2번을 돌게된다.첫번째 값을 꺼내(que.poll()) 맨 뒤에 삽입한다. (que.offer))

 

처음 큐

[1, 2, 3, 4, 5, 6, 7]

 

첫번째 for문 종료 후 큐

[3, 4, 5, 6, 7, 1, 2]

 

이런 모습이 된다.

 

그 후 스트링버퍼에 큐의 첫번째 값을 꺼내 삽입한다.

큐 내에 숫자가 남아 있다면 ", " 삽입

 

큐가 빌 때까지 반복 후 종료.

 

 

 

 

    sb.append(">");

    System.out.println(sb.toString());

 

while문이 종료되면 ">" 추가 후 결과 출력

 

 

 

 

 

채점 결과