problem solving
1168번: 요세푸스 문제2
Shinuk Yi
2020. 2. 19. 14:38
혼자 힘으로 풀지 못했다.
퍼포먼스를 만족키지 못했는데
다른 사람들의 풀이를 참조해서 vector의 erase를 사용하면 된다는 걸 알았다.
(erase는 memmove로 구현해서 매우, 매우 빠르다고 한다)
하지만 이 문제는 세그먼트 트리를 사용하라는 목적으로 만든 것 같다.
세그먼트 트리를 알아보자...
#include <iostream>
#include <vector>
int main(void) {
int len, term;
std::cin >> len >> term;
std::vector<int> arr(len);
for (int i = 0; i < len; i++) {
arr[i] = i + 1;
}
int pos = -1;
std::cout << "<";
while (true) {
pos = (pos + term) % arr.size();
std::cout << arr[pos];
if (arr.size() == 1) {
std::cout << ">";
break;
}
std::cout << ", ";
arr.erase(arr.begin() + pos--);
}
return 0;
}
|
cs |