요세푸스 명단
문제 설명
1번부터 n번까지의 순서를 가진 사람들이 원형으로 앉아 있다.
처음에는 1번 위치의 사람부터 세기 시작한다.
k번째 사람이 되면 그 사람은 모임에서 제외된다.
그 다음에는 방금 제외된 사람의 다음 사람부터 다시 1번째로 세기 시작한다.
이 과정을 모든 사람이 제외될 때까지 반복한다.
각 사람의 번호와 이름이 주어질 때, 모임에서 제외되는 순서대로 번호와 이름을 출력하는 프로그램을 작성하시오.
입력 설명
첫째 줄에 두 정수 n, k가 공백으로 구분되어 입력된다.
1 <= n <= 1001 <= 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);
}
}
코멘트