반응형
🔺 문제
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
|
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
Queue<Integer> queue = new LinkedList<>();
for(int i = 1 ; i <= N ; i++) {
queue.add(i);
}
sb.append("<");
// K-1까지 처음에 있던 값을 맨 뒤로 보냄
while(queue.size() != 1) {
for(int i = 0 ; i < K - 1 ; i++) { // K번이 아닐 때는 맨 뒤로 이동
queue.offer(queue.poll());
}
sb.append(queue.poll()).append(", "); // K번이 되면 제거
}
sb.append(queue.poll()).append(">"); // 큐에 남은 마지막 원소
System.out.println(sb);
}
}
|
cs |
✅ 해결 아이디어
✔ 큐
- 1~N까지 숫자를 넣는다.
- 큐의 첫 번째 원소부터 K-1번째 숫자를 큐에서 빼고 맨 뒤에 추가
- K번째 원소는 큐에서 ㅅ제거
- 큐에 남아있는 원소가 1이 아닐 때까지 반복
🔺 다른 풀이들
- 과정 설명 & 그림 굿ㅠㅠㅠ
[백준 - Java] 1158번 : 요세푸스 문제
문제 더보기 https://www.acmicpc.net/problem/1158 요세푸스 문제는 다음과 같다. 1번부터 N번까지 N명의 사람이 원을 이루면서 앉아있고, 양의 정수 K(≤ N)가 주어진다. 이제 순서대로 K번째 사람을 제거한
minhamina.tistory.com
💬 느낀 점
어떻게 큐 쓸 생각을.......ㅎㅠ
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V | 240321 |
(+240321 2회독 : 16440KB, 192ms)
인덱스를 활용해서 더 효율적인 방법으로 풀었다! 🤭🤭
큐를 LinkedList로 선언해서 해당 idx의 값을 제거하고 가져올 수 있게 했다.
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
|
import java.util.*;
import java.io.*;
public class 요세푸스문제_한의정 {
static int N,K;
static LinkedList<Integer> q = new LinkedList<>(); // LinkedList로 큐 선언해 인덱스에 위치한 값 제거
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] str = br.readLine().split(" ");
N = Integer.parseInt(str[0]);
K = Integer.parseInt(str[1]);
if(N == 1) { // N이 1이면 바로 처리
System.out.println("<1>");
return;
}
for(int i = 1 ; i <= N ; i++) q.add(i);
int idx = K-1;
sb.append("<" + q.remove(idx) + ", ");
while(!q.isEmpty()) {
idx = (idx + K -1) % q.size();
int num = q.remove(idx);
sb.append(num);
if(q.size() != 0)
sb.append(", ");
}
sb.append(">");
System.out.println(sb.toString());
}
}
|
cs |
(참고)
[백준] 1158번 요세푸스 문제 자바(Java)
https://www.acmicpc.net/problem/1158 1158번: 요세푸스 문제 첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000) www.acmicpc.net 정답 코드 import java.io.*; import java.util.LinkedList; import j
dev-coco.tistory.com
반응형
'코테 > 백준' 카테고리의 다른 글
[백준/JAVA] 1271번: 엄청난 부자2 (0) | 2023.07.17 |
---|---|
[백준/JAVA] 2941번: 크로아티아 알파벳 (0) | 2023.07.15 |
[백준/JAVA] 11721번: 열 개씩 끊어 출력하기 (0) | 2023.07.12 |
[백준/JAVA] 1406번: 에디터 (0) | 2023.07.12 |
[백준/JAVA] 16917번: 양념 반 후라이드 반 (0) | 2023.07.11 |