풀이 -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 |