BOJ 길라잡이

[C/C++ 백준 1158번] 요세푸스 문제 (Silver 5)

새파란 공대생 2020. 10. 8. 21:01

www.acmicpc.net/problem/1158

 

1158번: 요세푸스 문제

첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)

www.acmicpc.net

방문하는 방법은 크게 어렵지 않다. bool 자료형의 visit배열을 만들어두고, false를 지나칠 때마다 cnt를 1씩 증가시켜주며 특정 cnt마다 (K마다) 큐에 넣어주자. 최종적으로 모든 배열을 방문했을 경우 큐의 모든 원소를 출력시켜주면 된다.

 

#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
int main(void){
	int N, K, totalcnt=0;
	queue <int> q;
	scanf("%d %d", &N, &K);
	bool visit[N+1];
	fill(visit, visit+N+2, false);
	int start = K, cnt = K;
	while(totalcnt<N){
		if(visit[start]==false){
			if(cnt==K){
				visit[start]=true;
				cnt=1;
				q.push(start);
				totalcnt++;//방문했는데 false고 K인경우 
			}
			else{
				cnt++;
			}
			start++;
		}
		else{
			start++;
		}
		if(start==N+1)
			start=1;
	}
	printf("<");
	while(!q.empty()){
		if(q.size()==1)
			printf("%d",q.front());
		else
			printf("%d, ",q.front());
		q.pop();
	}
	printf(">");
}