https://www.acmicpc.net/problem/1158
1158번: 요세푸스 문제
첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)
www.acmicpc.net
#include <iostream>
#include <string>
#include <queue>
using namespace std;
int main()
{
queue<int> queue1;
int N, K;
cin >> N;//사람 수
cin >> K;//건너 뛸 수
for (int i = 1; i <= N; i++)//N만큼 큐에 넣어준다
{
queue1.push(i);
}
cout << '<';
int tmp = N - 1;
while (tmp--)//반복문을 돌 횟수 N-1
{
for (int i = 1; i < K; i++)//queue 앞에있는 수를 k-1만큼 back으로 이동시킨 뒤
{
queue1.push(queue1.front());
queue1.pop();
}
cout << queue1.front()<<", ";//front에 있는 수를 출력하고 pop
queue1.pop();
}
cout << queue1.front() << '>';//반복문을 다 돈뒤 남은 queue안의 값 출력
}
예제의 경우 N=7,K=3이다 코드안에서 queue 안에는 1~7값이 순서대로 들어가 있다 그 뒤 맨 앞의 값(1)에서 k-1(2)만큼 뒤로 빼주면 맨 앞의 값은 3이된다 그 수를 출력하고 queue에서 제거한다.
그 다음은 4부터 다시 2개만큼 뒤로 빼주고 맨 앞에 있는 수(6)를 출력
이 과정을 반복한다
'백준 c++ > (1-1)백준 c++ 알고리즘 기초' 카테고리의 다른 글
백준 10872 c++ 팩토리얼 (0) | 2022.07.05 |
---|---|
백준 6588 c++ 골드바흐의 추측 (0) | 2022.07.05 |
백준 10845 c++ 큐 (0) | 2022.07.04 |
백준 1406 c++ 에디터 (0) | 2022.07.04 |
백준 c++ 1874 스택 수열 (0) | 2022.07.04 |