본문 바로가기

알고리즘

BOJ 백준 1158 : 조세퍼스 순열

(N-K) 조세퍼스 순열이란 숫자 N과 K가 주어질때, N은 1~N까지의 숫자가 원형테이블에 앉아있는것으로, K는 그 N명을 K번째마다 삭제해 나가는간다.

예를 들어 N이 7일때, 1~7번까지의 사람이 원형으로 앉아있다. K가 3일때, 1 2 3 4 5 6 7 / 1 2 4 5 6 7 / 1 2 4 5 7 / 1 4 5 7/  1 4 5/ 1 4 / 1순으로 삭제된다.

Queue를 이용하여 풀수 있다.

#include <queue>

queue<int> q;

q.push(N);
q.pop();
q.empty();
q.front();
q.back();
q.size();

Queue는 위와같이 사용할 수 있다.

이때, front()와 back()은 메모리 위치값을 알려주는것이 아니라, 들어있는 내용물의 값을 알려준다. 

N번째의 값이 아니면, pop()한값을 다시 queue에 push() 해준다. N 번째 값일때는 push하지않는다. 큐에 데이터가 남아있지 않을때까지 이작업을 반복한다.

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

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    
    int N,K;
    int count=1;
    
    cin>>N>>K;
    
    queue<int> q;
    
    for(int i=1; i<=N; i++)
        q.push(i);
    
    cout<<"<";
    while(!q.empty())
    {
        if(count!=K){
            
            q.push(q.front());
            q.pop();
            count++;
        }else if(count==K){
            if(q.size()!=1){
                cout<<q.front()<<", ";
            }else if(q.size()==1){
                cout<<q.front();
            }
            q.pop();
            count=1;
        }
    }
    cout<<">";
    
    return 0;
}

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

 

1158번: 조세퍼스 문제

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

www.acmicpc.net

 

'알고리즘' 카테고리의 다른 글

04 다이나믹프로그래밍 (DP)  (0) 2019.11.21
03 수학  (0) 2019.11.19
BOJ 백준 17298 : 오큰수  (0) 2019.11.17
BOJ 백준 17413 : 단어 뒤집기2  (0) 2019.11.17
02스택  (0) 2019.11.14