본문 바로가기
알고리즘/백준

[백준/C,C++] 11866번: 요세푸스 문제 0

by 이민훈 2021. 3. 15.

www.acmicpc.net/problem/11866

 

11866번: 요세푸스 문제 0

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

www.acmicpc.net

STL인 vector로 쉽게 해결이 가능한 문제입니다. 현재 지울 번호는 (index + k - 1) % size로 나타낼 수 있는데, 예제의 입력대로 n이 7, k가 3인 경우로 생각해보겠습니다. 1 2 3 4 5 6 7의 수열 중 처음 지워지는 번호는 (0 + 2) % 7로 2번인 3이 됩니다. 다음은 1 2 4 5 6 7의 수열 중 지워지는 번호는 (2 + 2) % 6으로 4번인 6이 됩니다. 1 2 4 5 7의 수열 중 지워지는 번호는 (4 + 2) % 5로 1번인 2가 되죠.

#include<iostream>
#include<vector>

using namespace std;

int main(void)
{
    int n, k; cin >> n >> k;
    vector<int> v(n);

    for (int i = 0; i < n; i++) {
        v[i] = i + 1;
    }

    int size = v.size();
    int idx = 0;
    cout << "<";
    while (size > 0) {
        idx = (idx + k - 1) % size;
        if (size == 1) cout << v[idx] << ">";
        else cout << v[idx] << ", ";
        v.erase(v.begin() + idx);
        size = v.size();
    }

    return 0;
}

큐를 이용해서 앞의 숫자들을 뒤로 계속 push 해주며 front에 해당하는 번호를 pop 해주거나, 원형 연결 리스트를 통해 좀 더 직관적으로 구현할 수도 있지만, 나머지 연산을 통해 지울 번호를 계속 갱신해줄 수 있기 때문에 벡터로 간단히 해결해 보았습니다.

'알고리즘 > 백준' 카테고리의 다른 글

[백준/C,C++] 10866번: 덱  (0) 2021.03.16
[백준/C,C++] 1966번: 프린터 큐  (0) 2021.03.16
[백준/C,C++] 2164번: 카드2  (0) 2021.03.15
[백준/C,C++] 18258번: 큐 2  (0) 2021.03.15
[백준/C,C++] 13305번: 주유소  (0) 2021.03.14

댓글