백준 11866 요세푸스 문제 0

2021-07-21 · PS
백준 11866 요세푸스 문제 0

문제

1번부터 N번까지가 원을 이루고 앉아 있다. K번째 사람을 차례로 제거하고, 남은 사람들로 원을 이어가며 같은 과정을 반복한다. 모두 제거되는 순서(요세푸스 순열)를 구하면 된다.

  • 입력: N K.
  • 출력: <a, b, ...> 형식의 요세푸스 순열.
  • 제한: 1 ≤ K ≤ N ≤ 1,000.

접근

원을 도는 동작은 큐로 그대로 흉내 낼 수 있다. 큐에 1..N을 넣고, 앞에서 하나씩 꺼내되 K-1명은 다시 뒤에 넣고(한 바퀴 돌리고), K번째는 꺼내서 결과에 담는다. 큐가 빌 때까지 반복하면 제거 순서가 그대로 만들어진다.

풀이

전체 코드: thxwelchs/algorithm

#include <bits/stdc++.h>

using namespace std;

queue<int> q;
int N, K;
vector<int> ans;

int main() {
   ios::sync_with_stdio(false);
   cin.tie(NULL); cout.tie(NULL);

   cin >> N >> K;
   for(int i = 1; i <= N; i++) {
       q.push(i);
   }

   while(!q.empty()) {
       for(int i = 1; i <= K; i++) {
           int t = q.front(); q.pop();

            if(i == K) {
                ans.push_back(t);
                continue;
            }
           q.push(t);
       }
   }

    cout << '<';
   for(int i = 0; i < ans.size(); i++) {
       if(i == ans.size() - 1) {
           cout << ans[i];
           continue;
       }
       cout << ans[i] << ", ";
   }
    cout << '>';

   return 0;
}

댓글

GitHub(giscus) 댓글은 설정 완료 후 활성화됩니다.