개발/알고리즘

1158_요세푸스문제

송디 2020. 11. 15. 20:42

www.acmicpc.net/problem/1158

 

1158번: 요세푸스 문제

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

www.acmicpc.net

요세푸스 문제이다. n명 중 k번째 있는 사람을 탈락시키면서 탈락 된 순서대로 큐에 넣는 형태이다. 

생각보다 꼬여서 다시 한 번 생각했다. 

1) n이랑 k가 같을 때

2) n이 k보다 작을 때

를 고려해야 한다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<iostream>
#include<vector>
 
using namespace std;
 
vector<int> yp;
int cnt[5001];
vector<int> ans;
 
int main(void){
    int n, k, len, t;
 
    cin >> n >> k;
    for(int i = 1; i <= n; i++)
        yp.push_back(i);
    t = -1;
    for(int i = 0; i < n; i++){
        len = k;
        while(len){
            t++; t %= n;
            if(!cnt[t])
                len--;
        }
        ans.push_back(yp[t]);
        cnt[t] = 1;
    }
    cout << "<";
    for(int i = 0; i < n;i++){
        cout << ans[i];
        if(i == n - 1)
            break;
        cout << ", ";
    }
    cout << ">"<< "\n";
}
 
cs
728x90

'개발 > 알고리즘' 카테고리의 다른 글

10799_쇠막대기  (0) 2020.11.16
10866_덱  (0) 2020.11.16
11656_접미사배열  (0) 2020.11.15
10824_네수  (0) 2020.11.15
11655_ROT13  (0) 2020.11.15