
사용자로부터 사람 수(n)와 카운트 수(k)를 입력받아,
1번부터 시작하여 k번째 사람을 반복적으로 제거한 뒤,
마지막으로 남는 사람의 번호를 출력한다.
int people, count;
do
{
Console.Write("사람 수를 입력해주세요 : ");
}
while (!int.TryParse(Console.ReadLine(), out people));
do
{
Console.Write("카운트를 입력해주세요 : ");
}
while (!int.TryParse(Console.ReadLine(), out count));
List<int> list = new(people);
for (int i = 1; i <= people; i++)
{
list.Add(i);
}
int index = 0;
while (list.Count > 1)
{
for (int i = 1; i < count; i++)
{
index++;
if (index >= list.Count)
{
index = (index - list.Count) < 0 ? 0 : index -= list.Count;
}
}
list.RemoveAt(index);
}
Console.WriteLine($"마지막 사람의 번호 : {list[0]}");
int people, count;
do
{
Console.Write("사람 수를 입력해주세요 : ");
}
while (!int.TryParse(Console.ReadLine(), out people));
do
{
Console.Write("카운트를 입력해주세요 : ");
}
while (!int.TryParse(Console.ReadLine(), out count));
List<int> list = new(people);
for (int i = 1; i <= people; i++)
{
list.Add(i);
}
1 ~ n 의 번호를 가진 사람 리스트 생성int index = 0;
while (list.Count > 1)
{
for (int i = 1; i < count; i++)
{
index++;
if (index >= list.Count)
{
index = (index - list.Count) < 0 ? 0 : index -= list.Count;
}
}
list.RemoveAt(index);
}
Console.WriteLine($"마지막 사람의 번호 : {list[0]}");
3-1. for문으로 1부터 count만큼 반복하면서 index를 증가
3-2. 증가한 index가 리스트 범위를 벗어나면,
index -= list.Count를 통해 다시 앞으로 반복되도록 조절
public static int Josephus(int n, int k)
{
Queue<int> que = new Queue<int>(n);
for (int i = 1; i<=n; i++)
{
que.Enqueue(i);
}
int count = 0;
while (que.Count > 1)
{
count++;
if (count % k == 0)
{
que.Dequeue();
}
else
{
int value = que.Dequeue();
que.Enqueue(value);
}
}
return que.Dequeue();
}
count 가 계속 증가하면서 if (count % k == 0) 일 때만 제거
else 일 때는 제거하고 다시 추가하여 순환되게 한다.
Queue를 사용하니 코드 길이가 확 줄었다.
이처럼 상황에 따라 사용할 줄 알아야 할텐데
여전히 List가 너무 편해서 의존하게된다. ㅠㅠ