반응형
선형 자료구조 - 조세푸스 문제
문제 출저 - 알고스팟 https://algospot.com/judge/problem/read/JOSEPHUS
풀이생각
1. 하나의 리스트에서 2명이 남을 때까지 자살한 병사를 삭제
=> 특정 위치의 삭제가 용이한 연결리스트를 사용하자
=> remove를 사용하려 했으나, 이것은 원소를 탐색하여 제거하는 것. 연결리스트를 선택한 이유가 없어짐
=> iterator를 지우는 erase를 사용하자
2. 마지막 원소에서 어떻게 iterator를 처음으로 옮겨줄까?
=> Linked list 마지막 원소의 다음 iterator에 접근했을 때, Linked list의 begin으로 iterator를 옮겨주기
=> 마지막 원소의 다음 주소를 가리키는 end를 사용하자
3. 그럼 어떤 방식으로 iterator를 옮겨갈까?
=> 마지막 원소에서 넘어가는 것을 검사해야하기 때문에, +K가 아닌 ++로 하나씩 접근하자
=> iterator가 end에 도달하면 begin으로 옮겨주기
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
|
#include <iostream>
#include <list>
using namespace std;
int N, K; // 3<= N,K <=1000
list<int> func(void) {
list<int> armies;
list<int>::iterator idx;
for (int i = 1; i <= N; ++i) {
armies.push_back(i);
}
idx = armies.begin();
for (int i = 0; i < N-2; ++i) {
idx = armies.erase(idx);
if (idx == armies.end()) {
idx = armies.begin();
}
for (int j = 0; j < K-1; ++j) {
++idx;
if (idx == armies.end()) {
idx = armies.begin();
}
}
}
return armies;
}
int main() {
cin.sync_with_stdio(false);
int T; // T <= 50
cin >> T;
while (T--) {
cin >> N;
cin >> K;
list<int> res = func();
cout << res.front() << " " << res.back() << "\n";
}
}
|
cs |
반응형
'IT > Algorithm' 카테고리의 다른 글
트리 - 트리 순회 순서 변경 (0) | 2020.08.22 |
---|---|
스택 - 짝이 맞지 않는 괄호 (0) | 2020.08.20 |
선형 자료 구조 (동적 배열, 연결 리스트) (0) | 2020.08.17 |
탐욕법 - 도시락 데우기 (0) | 2020.08.17 |
분할 정복 - 쿼드 트리 뒤집기 (0) | 2020.08.05 |
댓글