본문 바로가기
코딩테스트 준비/백준

[백준/BOJ][C++] 11866번 요세푸스 문제0

by 스테디코디스트 2023. 8. 24.
반응형

<문제 소개>


<소스 코드>

#include <iostream>
#include <queue>
using namespace std;

int main()
{
	// 쓰레드 환경이 아닐때 버퍼를 분리하여 처리속도를 빠르게 해줌
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int N, K;
	cin >> N >> K;

	queue<int> circle;
	
	// 순서대로 사람을 앉힘
	for (int i = 1; i <= N; i++)
	{
		circle.push(i);
	}

	cout << "<";

	while (circle.size() != 0)
	{
		for (int i = 1; i < K; i++)
		{
			// 맨 앞의 원소를 맨 뒤로 보냄
			circle.push(circle.front());
			circle.pop();
		}

		// K번째 원소를 output으로 보내고 해당 원소를 삭제
		cout << circle.front();
		circle.pop();		

		if (circle.size() != 0) cout << ", ";
	}

	cout << ">";

	return 0;
}

<풀이과정>

1. 큐 circle을 선언

2. 1부터 N까지 반복하며 큐에 차례로 수들을 입력

3. 출력형식에 따라 "<"를 먼저 출력

4. circle의 크기가 0이 될때까지 반복을 진행

5. 1부터 K-1까지 circle의 맨 앞의 원소를 맨 뒤로 보내는 작업을 하여 반복이 끝나면 K번째 수가 맨 앞에 오도록 만듦

6. 맨 앞에 위치한 K번째 수를 front를 이용해 출력하고 해당 수는 pop을 이용해 큐에서 내보낸다.

7. 이 과정을 반복하며 마지막을 제외하고는 ", "(쉼표와 공백)을 같이 출력해준다.

8. 모든 반복이 끝나면 "<"를 출력하여 마친다.


<코멘트>

큐의 특징을 잘 살려서 풀수 있었던 문제였다!


<제출결과>