요세푸스 명단


답안 제출

Points: 7
시간 제한: 1.0s
메모리 제한: 256M

문제 유형
허용된 언어
C++

문제 설명

1번부터 n번까지의 순서를 가진 사람들이 원형으로 앉아 있다.

처음에는 1번 위치의 사람부터 세기 시작한다.
k번째 사람이 되면 그 사람은 모임에서 제외된다.

그 다음에는 방금 제외된 사람의 다음 사람부터 다시 1번째로 세기 시작한다.
이 과정을 모든 사람이 제외될 때까지 반복한다.

각 사람의 번호와 이름이 주어질 때, 모임에서 제외되는 순서대로 번호와 이름을 출력하는 프로그램을 작성하시오.

입력 설명

첫째 줄에 두 정수 n, k가 공백으로 구분되어 입력된다.

  • 1 <= n <= 100
  • 1 <= k <= 20
  • 항상 n > k

둘째 줄부터 n개의 줄에 걸쳐 사람의 번호 no와 이름이 입력된다.

  • 1 <= no < 10000
  • 이름은 10byte 이내의 문자열이다.

사람들은 입력된 순서대로 원형으로 앉아 있다고 가정한다.

출력 설명

모임에서 제외되는 순서대로 각 사람의 번호와 이름을 한 줄에 하나씩 출력한다.

입력 예시 1

3 2
1 Kim
2 Jang
3 Lee

출력 예시 1

2 Jang
1 Kim
3 Lee

입력 예시 2

5 3
101 Min
102 Park
103 Choi
104 Han
105 Jung

출력 예시 2

103 Choi
101 Min
105 Jung
102 Park
104 Han

front

#include <stdio.h>
#include <stdlib.h>

struct Data
{
    int no;
    char name[20];
};

struct Node
{
    Data data;
    Node *next;
};

struct LinkedListQueue
{
private:
    int cnt = 0;
    Node *rear = NULL;

public:
    void enQueue(Data d);
    Data deQueue();
    int getCnt() { return cnt; }
};

rear

int main()
{
    int n, k;
    Data d;
    LinkedListQueue q;
    scanf("%d%d", &n, &k);
    for (int i = 0; i < n; i++)
    {
        scanf("%d %s", &d.no, d.name);
        q.enQueue(d);
    }

    while (q.getCnt())
    {
        for (int i = 1; i < k; i++)
        {
            q.enQueue(q.deQueue());
        }
        d = q.deQueue();
        printf("%d %s\n", d.no, d.name);
    }
}

코멘트

현재 작성된 코멘트가 없습니다.