PS_Baekjoon

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

SMILELY 2023. 2. 25. 22:52

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

 

11866번: 요세푸스 문제 0

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

www.acmicpc.net

풀이 : 

1. k만큼 카운트를 하고 k번째 인덱스를 출력한다.

2. 이미 출력한 수는 카운트하지 않는다.

3. n개의 수를 전부 출력하면 종료한다

 

코드 : 

#include <iostream>

using namespace std;

int main(void) {
    int n, k, cnt, done;
    bool visited[1005];

    cin >> n >> k;
    for(int i=1; i<=n; i++){
        visited[i] = false;
    }
    done = cnt = 0;
    cout << "<";
    while(done != n){
        for(int i=1; i<=n; i++){
            if(!visited[i]){
                cnt++;
                if(cnt == k){
                    cout << i;
                    if(done < n-1){
                        cout << ", ";
                    }
                    cnt = 0;
                    visited[i] = true;
                    done++;
                }
            }
        }
    }
    cout << ">" << endl;
}

- 인덱스를 카운트 할 cnt, n개를 카운트 할 done 변수 선언

- 방문 여부를 판별할 bool배열 visited 선언하고 n개만큼 false로 초기화

- 종료 조건이 n개 출력인 while문 안에 1부터 n까지 탐색하는 for문을 돌린다

- 방문하지 않았다면 카운트를 해주고 k와 같아지면 해당 인덱스를 출력

    - cnt 초기화, 해당 visited에 방문 체크, done 카운트를 1 올려준다

- 주의할 부분은 if(done < n-1)

    그냥 i와 같이 ", "해줬다가 한번 틀리고 조건을 넣어줬다