본문 바로가기
알고리즘/문자열 처리, 기타 자료구조

[java 백준] 실버 5/ 1158번 요세푸스 문제

by Meaning_ 2021. 9. 1.
728x90
반응형

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

 

1158번: 요세푸스 문제

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

www.acmicpc.net

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        Queue<Integer> queue = new LinkedList<>();
 
        String token = br.readLine();
        String[] tokens = token.split(" ");
        int num = Integer.parseInt(tokens[0]);
        int slice = Integer.parseInt(tokens[1]);
        for (int i = 1; i <= num; i++) {
            queue.add(i);
        }
        sb.append("<");
        int i = 0;
        while (!queue.isEmpty()) {
            i++;
            if (i == slice) {
                if (queue.size() <= 1 && i == slice) {
                    sb.append(queue.poll());
                } else {
                    sb.append(queue.poll()).append(", ");
                }
 
                i = 0;
            } else {
                queue.add(queue.poll());
            }
 
        }
        sb.append(">");
 
        System.out.println(sb.toString());
 
    }
 
}
cs

 

처음 쓴 코드


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        Queue<Integer> lqueue = new LinkedList<>();
        Queue<Integer> rqueue = new LinkedList<>();
        String token = br.readLine();
        String[] tokens = token.split(" ");
        int num = Integer.parseInt(tokens[0]);
        int slice = Integer.parseInt(tokens[1]);
        for (int i = 1; i <= num; i++) {
            lqueue.add(i);
        }
        sb.append("<");
        int i = 0;
        while (!lqueue.isEmpty() || !rqueue.isEmpty()) {
 
            while (!lqueue.isEmpty()) {
                i++;
                if (i == 3) {
                    sb.append(lqueue.poll()).append(", ");
                    i = 0;
                } else {
                    rqueue.add(lqueue.poll());
                }
 
            }
            while (!rqueue.isEmpty()) {
                i++;
                if (i == 3) {
                    sb.append(rqueue.poll()).append(", ");
                    i = 0;
                } else {
                    rqueue.add(rqueue.poll());
                }
 
            }
        }
        sb.append(">");
 
        System.out.println(sb.toString());
 
    }
 
}
cs

1406번 처럼 큐를 두게 만들어서 풀려고 했는데 위에 사진 처럼 맨 뒤에 쉼표랑 공백이 남아버려서 큐 2개 만드는 방법은 포기했다 (정말 하나 알려주면 하나만 쓸줄 안다 ㅋㅋㅋㅋㅋ)

 

원형큐 코드를 찾아보니

 

queue.add(queue.poll());

 

큐의 맨 위 원소를 꺼내서 다시 큐에 넣는 방법이 있었다..! 

 

 

그림으로 나타내보자면 이렇다!

728x90
반응형

댓글