공부/백준

백준 1158번: 요세푸스 문제(C++)

상연 2020. 12. 3. 15:39

목차

    www.acmicpc.net/problem/1158

     

    1158번: 요세푸스 문제

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

    www.acmicpc.net

    코드

    #include <iostream>
    using namespace std;
    
    bool check[5001] = {0, };
    int n, k;
    
    void solve(int idx, int cnt){
    	if(cnt == n){
    		cout << idx << ">" << endl;
    		return;}
    	else {
    		cout << idx << ", ";
    		check[idx] = 1;
    	}
    	int cycle = 0;
    	
    	while(cycle != k){
    		if(++idx == (n + 1)) idx = 1;
    		if(check[idx] == true) continue;
    		else cycle++;
    	}
    	
    	solve(idx, cnt+1);
    }
    
    int main() {
    	cin >> n >> k;
    	cout << "<";
    	solve(k, 1);
    	return 0;
    }

    풀이

    분류를 보니 큐를 사용해서 풀어야 하는 문제였던 것 같다.

    하지만 지금 나는 큐를 배웠던 기억이 아주 어렴풋 하게 있고... 큐를 사용해서 풀진 않았다.

    어떻게 보면 DFS? BFS? 같은 방식으로 재귀함수를 사용해서 풀었다.

    출력이 중복된 수는 안 나오며, 자연수 1부터 주어진 수 N까지의 모든 수가 하나씩 나온다는 것에 기인했다.

    check 배열을 하나 만들어서 그 수가 나오면 체크를 하고 그 자리 수는 무시해서 다음 K번째 순서를 찾는다.

    그렇게 찾은 횟수가 N번이 되면 끝나는 방법이었다.

     

    나중에 자료구조를 배워서 Q 컨테이너를 사용해서 풀어봐야겠다.