백준 c++/(1-1)백준 c++ 알고리즘 기초

백준 1158 c++ 요세푸스 문제

현구구 2022. 7. 4. 16:49

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