[C++] 백준 1158 : 요세푸스 문제

Kim Nahyeong·2022년 1월 6일
0

백준

목록 보기
31/157

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

int main(int argc, char **argv){
    int N, K, i = 0, cnt = 0;
    queue<int> q;
    scanf("%d %d",&N,&K);
    int * circle = new int[N];

    while(q.size() != N){
        if(circle[i] != 1) { // 1이면 circle
            cnt++;
        }
        if(cnt == K){
            circle[i] = 1;
            q.push(i+1);
            cnt = 0;
        }
        i++;
        if(i >= N){
            i = 0;
        }
    }


    printf("<");

    for(int i=0; i<N; i++){ // 큐에 넣고 한번에 출력
        if(i == N - 1){
            printf("%d", q.front());
        } else {
            printf("%d, ", q.front());
        } 
        q.pop();
    }

    printf(">");

    return 0;
}

오늘의 키포인트

  • 또 엄청 비효율적으로 풀고 말았다. 큐를 쓰긴 쓰는데 그냥 결과가 나오면 큐에 넣고 출력만 하는 그런 코드

  • 이상적인 것은 우선 큐에 모든 숫자를 다 넣고 주어진 수(K)의 배수가 아니면 큐에서 제일 앞에 있는 수를 빼서 뒤에 넣는다. 그러면 계속 제일 앞에서 K번째 수만 출력하면 된다. 헉 너무 천재같다...!

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

int main(void) {
	int num, data;
	queue<int> q;

	cin >> num >> data;
	cout << "<";

	for (int i = 1; i <= num; i++) {
		q.push(i);
	}

	while (!q.empty()) {
		for (int j = 0; j < data-1; j++) {
			q.push(q.front());
			q.pop();
		}

		cout << q.front();
		q.pop();

		if (!q.empty())
			cout << ", ";
	}
	cout << ">";
}

출처: https://parkssiss.tistory.com/81 [코딩 쟁이]

0개의 댓글