타노스는 요세푸스가 밉다

날짜 : 2024년 8월 19일

기술 : queue

언어 : C++

출처 : https://www.acmicpc.net/problem/28066 baekjoon


시간 제한 메모리 제한
0.1 초 512 MB

문제

N마리의 청설모가 1번부터 N번까지 순서대로 시계 방향으로 원을 이루면서 앉아있다. 타노스는 손을 튕겨서 순서대로 두 번째 청설모를 제거해 왔는데, 옆 나라의 수학자 요세푸스도 이미 그 방식을 사용해 왔다는 것을 알자 기분이 상했다. 그래서 타노스는 새롭게 청설모를 제거하는 방식을 고안했다.

시작은 1번 청설모를 첫 번째 청설모로 한다. 타노스가 손을 튕기면 첫 번째 청설모부터 시계 방향으로 K마리의 청설모가 선택된다. 이후 첫 번째 청설모를 제외한 2, …, K번째 청설모가 번호가 증가하는 순서대로 제거되고 첫 번째 청설모만 살아남는다. 단, 남아 있는 청설모가 K마리보다 적으면 첫 번째 청설모를 제외한 모든 청설모가 제거된다. 제거된 후 남아있는 청설모가 2마리 이상일 경우 첫 번째 청설모의 오른쪽 청설모가 첫 번째 청설모가 되고, 제거하는 과정을 다시 진행한다. 이 과정은 청설모가 1마리 남을 때까지 계속된다.

N, K가 주어질 때 마지막으로 남는 청설모의 번호를 구하여라.

입력

첫째 줄에 정수 N과 K가 공백을 사이에 두고 주어진다. (2 ≤ N, K ≤ 10⁶)

출력

마지막으로 남는 청설모의 번호를 출력한다.

예제

입력 1

5 4

출력 1

5

남아있는 청설모의 번호를 순서대로 표현해 보면

1 2 3 4 5

첫 제거는 1번 청설모를 제외한 2, 3, 4번 청설모가 제거된다. 이후 첫 번째 청설모는 5번 청설모이다.

1 2 3 4 5

남아 있는 청설모가 K마리보다 적으므로 첫 번째 청설모인 5번 청설모를 제외한 1번 청설모만 제거한다.

1 2 3 4 5

입력 2

1007 15

출력 2

871

노트

동물을 사랑합시다.

출처

University > 서강대학교 > 2023 서강대학교 청정수컵 > 새내기 Round F번

University > 서강대학교 > 2023 서강대학교 청정수컵 > 청정수 Round D번

University > 서강대학교 > 2023 서강대학교 청정수컵 > Open Contest F번

  • 문제를 검수한 사람: djs100201, dong_gas, eaststar, hulahula3247, jthis, lem0nad3, mjhmjh1104, pjshwa, yunny_world
  • 문제를 만든 사람: maker29

알고리즘 분류

  • 구현
  • 자료 구조
  • 시뮬레이션

Solution

#include <iostream>
#include <queue>

using namespace std;

int main() {
    int N, K;
    cin >> N >> K;

    // 청설모를 queue에 넣기
    queue<int> squirrels;
    for (int i = 1; i <= N; i++) {
        squirrels.push(i);
    }

    // 청설모가 1마리 남을 때까지 타노스의 방식으로 숫자 제거하기
    while (squirrels.size() > 1) {
        // 첫 번째 청설모는 따로 보관하기 (나중에 다시 queue에 넣어줌)
        int first = squirrels.front();
        squirrels.pop();

        // K-1마리의 청설모를 queue에서 순서대로 제거하기
        int limit = min(K-1, (int)squirrels.size());
        for (int i = 0; i < limit; i++) {
            squirrels.pop();
        }

        // 첫 번째 청설모를 다시 queue에 넣기
        squirrels.push(first);
    }

    // 마지막으로 남은 청설모의 번호 출력하기
    cout << squirrels.front() << endl;
    return 0;
}

목차