백준 - 1158 번 요세푸스
2025. 4. 11. 10:11

풀이 -1 

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

public class Main_1158_요세푸스문제 {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer tokens = new StringTokenizer(br.readLine());
		
		int N = Integer.parseInt(tokens.nextToken());// 사람 수
		int K = Integer.parseInt(tokens.nextToken());// 제거할 간격
		
		//대기열 생성(큐 생성)
		Queue<Integer> queue = new ArrayDeque<Integer>();

		//1부터 N까지 큐에 사람(번호) 입력(삽입)
		for(int i=1; i<=N; i++) {
			queue.offer(i);
		}
		
		StringBuilder sb = new StringBuilder();//순열 요소값 저장
		sb.append("<");
		
		while(!queue.isEmpty()) {//큐가 빈 상태가 될때까지
			
			//앞의 번호를 뒤로 보내기!!  ==>  K-1명은 뒤로 보낸다!!
			for(int i=0; i<K-1; i++) {
//				1. queue.poll()
//				2. queue.offer(value)
				queue.offer(queue.poll());
			}
			
			//K번째 도달 ==> K번째 사람 제거
			sb.append(queue.poll());   //제거한 값(숫자 번호)을 출력(StringBuilder)에 추가
			
            if(!queue.isEmpty())  //맨 마지막 요소가 아니라면
			   sb.append(", "); 
			  
		}//while
		sb.append(">");
				
		System.out.println(sb.toString());// 요세푸스 순열 출력

		br.close();
	}// main

}

 

풀이-2

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


//11866 요세푸스 문제0
public class Main_1158_요세푸스문제v2 {
/*
    Deque (Double Ended Queue)
    
- 양쪽 끝에서 삽입과 삭제가 모두 가능한 자료구조
- 앞(front)과 뒤(rear)에서 데이터를 넣거나 뺄 수 있음.    
    
    ----------------------------
      d1  d2  d3  d4  d5   d6
    ----------------------------
    
input  --->                            <--- input
output <---	                           ---> output
    
    
addFirst()                               addLast()
offerFirst()                             offerLast()
                                         add()
                                         offer()
                                 
removeFirst()                            removeLast()
pollFirst()                              pollLast()
remove()
poll()
                                 
getFist()                                getLast()
peek()                                   peekLast()
peekFist()                                         
    
    
*/    
  static int N;
  static int K;
  static StringBuilder sb = new StringBuilder();
  static Deque<Integer> queue = new ArrayDeque<>();
  
  //요세푸스 순열
  public static void main(String[] args) throws Exception{
	 
	 input();
	 func();
	 print();
	 
  }//end main
  
  static void input() throws Exception {
	  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	  StringTokenizer tokens = new StringTokenizer(br.readLine());
	  N = Integer.parseInt(tokens.nextToken()); //사람수
	  K = Integer.parseInt(tokens.nextToken());//제거할 사람의 위치

	  for (int i = 1; i <= N; i++)
	     queue.addLast(i); //1부터 N까지 번호 입력
  }//input
  
  static void func() {
	  sb.append('<');	 
	 while(!queue.isEmpty()) {
			 for(int i=1; i<=K; i++) {
				 if(i==K) { //제거할 위치라면				 
					 sb.append(queue.pollFirst());//제거한 사람의 번호출력
					 if(queue.size()>0)sb.append(", ");
				 }else {
					 queue.addLast(queue.pollFirst());//맨앞의 사람을 맨뒤로 이동
				 }
			 }
	 }
	  sb.append('>');	  
  }//func
  
  static void print() {
	  System.out.println(sb.toString());
  }//print
  
}//end class

'코딩테스트' 카테고리의 다른 글

NextPermutation  (0) 2025.04.12
CompleteBinaryTree(완전이진탐색)  (0) 2025.04.11
백준 - 10845번  (0) 2025.04.11
QueueArray  (0) 2025.04.10
백준 - 2161번 카드1  (0) 2025.04.10