반응형
취업을 위해서 코딩테스트 공부를 진행하는 도중에 쓰는 알고리즘 문제 입니다.
백준에서 검색하면 나오는 요명한 요세푸스 문제입니다.
요세푸스의 경우에는 생각보다 인지도가 있지만 엄청 어려운 난이도는 아닌 것 같다.
요세푸스 문제는 다음과 같다.
1번부터 N번까지 N명의 사람이 원을 이루면서 앉아있고, 양의 정수 K(≤ N)가 주어진다. 이제 순서대로 K번째 사람을 제거한다. 한 사람이 제거되면 남은 사람들로 이루어진 원을 따라 이 과정을 계속해 나간다. 이 과정은 N명의 사람이 모두 제거될 때까지 계속된다. 원에서 사람들이 제거되는 순서를 (N, K)-요세푸스 순열이라고 한다. 예를 들어 (7, 3)-요세푸스 순열은 <3, 6, 2, 7, 5, 1, 4>이다.
N과 K가 주어지면 (N, K)-요세푸스 순열을 구하는 프로그램을 작성하시오.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
n = 7
k = 3
var list = ArraySlice<Int>(1...n)
var reult = ""
while(list.isEmpty == false){
for i in 0..<k{
if i + 1 == k{
reult.append(String(list.first!) + ", ")
list = list.dropFirst()
}else{
list.append(list.first!)
list = list.dropFirst()
}
}
}
|
cs |
제가 구현한 요세푸스 문제 해답입니다.
다만 백준의 프로그램에서는 문제를 받는 부분을 구현하지 못하여 패스하지는 못했습니다.
대체로 요세푸스의 문제를 푸는 방법은
큐를 구현하는 방식인 것 같습니다.
1. k-1까지 배열 뒤로 옮기고
2. k번째 배열을 결과 배열로 옮기고
3. k번째 배열을 삭제
이것을 반복하여 배열이 없어질때까지 반복 시켜주면 완료되는 방식 입니다.
밑에는 자바 코드 입니다.
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
|
import java.util.ArrayList;
public class ys {
public static void main(String[] args) {
int n = 7;
int k = 3;
ys(n, k);
}
public static void ys(int n, int k){
ArrayList list = new ArrayList();
for (int i = 0; i < n; ++i){
list.add(i + 1);
}
System.out.println(list);
ArrayList result = new ArrayList();
while(!list.isEmpty()){
for (int index = 1; index <= k; ++index){
if( index == k ){
int a = (int) list.get(0);
System.out.println(a);
System.out.println(list);
list.remove(0);
result.add(a);
}else{
int a = (int) list.get(0);
list.remove(0);
list.add(a);
}
}
}
System.out.println(result);
}
}
|
cs |
반응형
'Algorithm & Data Structure > Algorithm' 카테고리의 다른 글
[프로그래머스]제일 작은 수 제거하기 (1) | 2023.11.12 |
---|---|
[프로그래머스]없는 숫자 더하기 (0) | 2023.11.11 |
[프로그래머스]서울에서 김서방 찾기 풀이 (0) | 2023.11.10 |
[프로그래머스] 콜라츠 추측 풀이 for Java (0) | 2023.11.09 |
[Algorithm] Swift 핸드폰 번호 가리기 (0) | 2022.07.04 |