문제
백준 1158번 요세푸스 문제
https://www.acmicpc.net/problem/1158
1158번: 요세푸스 문제
첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)
www.acmicpc.net
코드
#include<iostream>
#include<deque>
using namespace std;
int n, k;
int main() {
cin >> n >> k;
deque<int> d;
for (int i = 1; i <= n; i++)d.push_back(i);
cout << "<";
while (d.size()>1) {
int cnt = k-1;
while (cnt--) {
d.push_back(d.front());
d.pop_front();
}
cout << d.front() << ", ";
d.pop_front();
}
cout << d.front() << ">";
}
풀이방법
원을 이뤘다는 성질을 이용한다. (k-1)번동안은 사람을 그냥 맨 뒤로 보내고, k번째 사람은 제거한다. 맨 뒤로 보낼 때에는 front를 push_back해주고 pop_front를 해준다. 제거할 때는 front를 출력해주고 pop_front를 한다.
고민과정
원이라길래 복잡하게 mod연산자까지 생각하다가 deque를 이용하면 된다는 사실을 깨달았다. 출력방식(< , >)을 제대로 맞추지 않아서 틀렸었다. 세상에나
'algorithm > Stack, Queue, Deque' 카테고리의 다른 글
[C++] BOJ 2346 풍선 터뜨리기 (0) | 2021.07.09 |
---|---|
[C++] BOJ 1918 후위 표기식 (0) | 2021.05.21 |
[C++] BOJ 2161 카드1 (0) | 2021.05.21 |
[C++] BOJ 10773 Zero That Out (0) | 2021.05.21 |
[C++] BOJ 10828 스택 (0) | 2021.05.21 |