본문 바로가기
백준/자료구조

백준 1158 c++ "요세푸스 문제" -PlusUltraCode-

by PlusUltraCode 2025. 9. 17.

https://www.acmicpc.net/problem/1158

[필자 사고]

간단한 큐를 이용하는 문제다.

문제에서 주어진 K수만큼 큐에서 뽑고 다시 넣는걸 반복하면 쉽게 문제를 해결할 수 있따.

 

아래는 자세한 코드해설이다.

[코드 해설]

main 함수

  • 프로그램의 시작점입니다.
  • 입력으로 N(사람 수)와 K(제거할 순서)를 받습니다.

queue 자료구조 초기화

  • queue<int> myQueue;
  • 1번부터 N번까지 사람을 차례로 큐에 넣습니다 (myQueue.push(i)).

제거 과정 반복 (while (!myQueue.empty()))

  • 큐가 빌 때까지 계속 실행합니다.
  • 안쪽에서 for문을 이용해 K번 반복하며 사람을 순서대로 뽑아옵니다 (myQueue.front(), myQueue.pop()).

제거 로직 (for (int i = 0; i < K; i++))

  • i == K-1일 때 → K번째 사람에 해당하므로 resultNums 벡터에 추가합니다. (즉, 제거된 사람 기록)
  • 그렇지 않으면 → 다시 큐의 뒤로 넣습니다 (myQueue.push(nowNum)).

결과 출력

  • 모든 사람이 제거된 순서를 resultNums 벡터에 저장해 둔 뒤 출력합니다.
  • 출력 형식은 <a, b, c, ...> 형태로 맞춰집니다.
    • 마지막 원소는 뒤에 , 없이 출력하도록 조건문 처리했습니다.

[소스 코드]

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

int N, K;

int main(void) {
	cin >> N >> K;
	queue<int> myQueue;
	for (int i = 1; i <= N; i++) {
		myQueue.push(i);
	}

	
	vector<int> resultNums;
	while (!myQueue.empty()) {

		for (int i = 0; i < K; i++) {
			int nowNum = myQueue.front();
			myQueue.pop();
			if (i == K - 1) {
				resultNums.push_back(nowNum);
			}
			else {
				myQueue.push(nowNum);
			}
		}

	}
	cout << "<";
	for (int i = 0; i < resultNums.size(); i++) {
		if (i == resultNums.size() - 1) {
			cout << resultNums[i];
			break;
		}
		cout << resultNums[i] << ", ";
	}
	cout << ">";
}