

알고리즘 분류
- 구현
- 자료 구조
- 큐
https://www.acmicpc.net/problem/1158
N과 K가 주어진다.
원형 테이블에 1번부터 N번까지 N명의 사람이 앉고,
순서대로 K번째 사람을 제거한다.
이때 원에서 사람들이 제거되는 순서인 (N, K)-요세푸스 순열을 구하는 문제다.
생각했던 방법은 list에 순서대로 1부터 N까지를 저장해두고,
list의 사이즈가 1보다 클 때까지 아래 과정을 반복하는 것이다.
- cur 변수에 현재 제거할 index를 저장해둔다.
- cur index에 해당하는 수를 sb에 저장하면서 list에서 삭제한다.
- cur는 K씩 커지게 하고, cur이 list의 사이즈보다 커지면 list 사이즈 만큼 줄인다.
그러나 이렇게 cur를 증가시키면,
2바퀴 이상 돌게 되면 범위를 못 맞추는 경우가 생긴다.
이럴 때는 mod 연산을 사용한다고 한다.
따라서 생각한 방법을 사용하되,
cur = (cur + K - 1) % list.size();
로 cur를 항상 0 <= cur < list.size() 범위 내로 맞춘다.
import java.io.*;
import java.util.*;
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());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
StringBuilder sb = new StringBuilder();
ArrayList<Integer> list = new ArrayList<>();
for (int i = 1; i <= N; i++) {
list.add(i);
}
int cur = 0;
sb.append("<");
while(list.size() > 1) {
cur = (cur + K - 1) % list.size();
sb.append(list.get(cur)).append(", ");
list.remove(cur);
}
sb.append(list.get(0)).append(">");
System.out.println(sb.toString());
}
}
모듈러 연산을 사용하지 않으려면
while문을 통해 cur이 list size보다 클 경우 반복적으로 list size만큼 빼주는 방법도 있다.
import java.io.*;
import java.util.*;
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());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
StringBuilder sb = new StringBuilder();
List<Integer> list = new ArrayList<>();
for (int i = 1; i <= N; i++) {
list.add(i);
}
int cur = 0;
sb.append("<");
while (list.size() > 1) {
cur = cur + K - 1;
// 인덱스가 리스트 길이를 넘어가면 다시 0부터 돌게끔 조정
while (cur >= list.size()) {
cur -= list.size();
}
sb.append(list.get(cur)).append(", ");
list.remove(cur);
}
sb.append(list.get(0)).append(">");
System.out.println(sb);
}
}
'Languages > Java' 카테고리의 다른 글
[프로그래머스 고득점 Kit/Java] 완주하지 못한 선수 (0) | 2025.03.23 |
---|---|
[BOJ 길라잡이/Java] 11일차 #5430 AC (0) | 2025.03.23 |
[BOJ 길라잡이/Java] 11일차 #1966 프린터 큐 (0) | 2025.03.23 |
[BOJ 길라잡이/Java] 9일차 #1874 스택 수열 (0) | 2025.03.21 |
[BOJ 길라잡이/Java] 8일차 #9012 괄호 (0) | 2025.03.19 |


알고리즘 분류
- 구현
- 자료 구조
- 큐
https://www.acmicpc.net/problem/1158
N과 K가 주어진다.
원형 테이블에 1번부터 N번까지 N명의 사람이 앉고,
순서대로 K번째 사람을 제거한다.
이때 원에서 사람들이 제거되는 순서인 (N, K)-요세푸스 순열을 구하는 문제다.
생각했던 방법은 list에 순서대로 1부터 N까지를 저장해두고,
list의 사이즈가 1보다 클 때까지 아래 과정을 반복하는 것이다.
- cur 변수에 현재 제거할 index를 저장해둔다.
- cur index에 해당하는 수를 sb에 저장하면서 list에서 삭제한다.
- cur는 K씩 커지게 하고, cur이 list의 사이즈보다 커지면 list 사이즈 만큼 줄인다.
그러나 이렇게 cur를 증가시키면,
2바퀴 이상 돌게 되면 범위를 못 맞추는 경우가 생긴다.
이럴 때는 mod 연산을 사용한다고 한다.
따라서 생각한 방법을 사용하되,
cur = (cur + K - 1) % list.size();
로 cur를 항상 0 <= cur < list.size() 범위 내로 맞춘다.
import java.io.*;
import java.util.*;
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());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
StringBuilder sb = new StringBuilder();
ArrayList<Integer> list = new ArrayList<>();
for (int i = 1; i <= N; i++) {
list.add(i);
}
int cur = 0;
sb.append("<");
while(list.size() > 1) {
cur = (cur + K - 1) % list.size();
sb.append(list.get(cur)).append(", ");
list.remove(cur);
}
sb.append(list.get(0)).append(">");
System.out.println(sb.toString());
}
}
모듈러 연산을 사용하지 않으려면
while문을 통해 cur이 list size보다 클 경우 반복적으로 list size만큼 빼주는 방법도 있다.
import java.io.*;
import java.util.*;
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());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
StringBuilder sb = new StringBuilder();
List<Integer> list = new ArrayList<>();
for (int i = 1; i <= N; i++) {
list.add(i);
}
int cur = 0;
sb.append("<");
while (list.size() > 1) {
cur = cur + K - 1;
// 인덱스가 리스트 길이를 넘어가면 다시 0부터 돌게끔 조정
while (cur >= list.size()) {
cur -= list.size();
}
sb.append(list.get(cur)).append(", ");
list.remove(cur);
}
sb.append(list.get(0)).append(">");
System.out.println(sb);
}
}
'Languages > Java' 카테고리의 다른 글
[프로그래머스 고득점 Kit/Java] 완주하지 못한 선수 (0) | 2025.03.23 |
---|---|
[BOJ 길라잡이/Java] 11일차 #5430 AC (0) | 2025.03.23 |
[BOJ 길라잡이/Java] 11일차 #1966 프린터 큐 (0) | 2025.03.23 |
[BOJ 길라잡이/Java] 9일차 #1874 스택 수열 (0) | 2025.03.21 |
[BOJ 길라잡이/Java] 8일차 #9012 괄호 (0) | 2025.03.19 |