일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 시작
- 빅오 표기법
- 그래픽 디자인
- 잴다의 전설 티어스 오브 더 킹덤
- 그리디 알고리즘
- 스택
- 자료구조
- 코딩테스트
- 카니발대학교 공대강국
- VPS
- 큐
- 배열 리스트
- blender
- 이진 탐색
- 2025 대한민국 채용박람회
- unity engine
- vrm posing desktop
- T자형 인재
- windows 12
- 닌텐도 스위치 2
- 택시 기하학
- i자형 인재
- 브루트포스 알고리즘
- c#
- 라자냐
- VRoid Studio
- 다이나믹프로그래밍
- 우선순위 큐
- 영어
- 마인크래프트
Archives
- Today
- Total
WalkerJei's Lifelog
백준알고리즘 1158번 요세푸스 문제 C# 본문
세부 정보
- 사이트: 백준알고리즘
- 번호: 1158
- 문제명: 요세푸스 문제
- 언어: C#
- 분류: 구현, 자료 구조, 큐
- 비고:
문제
요세푸스 문제는 다음과 같다.
1번부터 N번까지 N명의 사람이 원을 이루면서 앉아있고, 양의 정수 K(≤ N)가 주어진다. 이제 순서대로 K번째 사람을 제거한다. 한 사람이 제거되면 남은 사람들로 이루어진 원을 따라 이 과정을 계속해 나간다. 이 과정은 N명의 사람이 모두 제거될 때까지 계속된다. 원에서 사람들이 제거되는 순서를 (N, K)-요세푸스 순열이라고 한다. 예를 들어 (7, 3)-요세푸스 순열은 <3, 6, 2, 7, 5, 1, 4>이다.
N과 K가 주어지면 (N, K)-요세푸스 순열을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)
출력
예제와 같이 요세푸스 순열을 출력한다.
풀이
Queue<int>를 사용하면 int temp = (int) queue.Dequeue();로 표시하지 않아도 된다.
1부터 K - 1번까지의 사람들은 임시 변수에 저장 후 맨 뒤로 이동시킨다.
using System.Text;
// StreamReader, Streamwriter, StringBuilder 선언
StreamReader sr = new StreamReader(new BufferedStream(Console.OpenStandardInput()));
StreamWriter sw = new StreamWriter(new BufferedStream(Console.OpenStandardOutput()));
StringBuilder sb = new StringBuilder();
// Queue<int> 사용으로 int temp = queue.Dequeue();에서 언박싱이 불필요
// int temp = (int) queue.Dequeue();로 표시하지 않아도 된다.
Queue<int> queue = new Queue<int>();
// 원을 이루며 앉아있을 사람의 수와 제거할 번호 입력
int[] nk = sr.ReadLine().Split().Select(int.Parse).ToArray();
// 1부터 N까지의 번호를 가진 사람들이 원을 이루어 앉는다
for (int i = 1; i <= nk[0]; i++)
queue.Enqueue(i);
sb.Append("<");
while(queue.Count > 1)
{
// 1부터 K - 1까지의 사람들은 자리 뒤로 이동한다.
for (int i = 1;i < nk[1]; i++)
{
// 임시 변수에 저장
int temp = queue.Dequeue();
// 큐의 맨 뒤로 이동
queue.Enqueue(temp);
}
// K번째 사람의 번호를 대입
sb.Append(queue.Peek() + ", ");
// K번째 값을 제거
queue.Dequeue();
}
// 마지막 남은 사람의 정보 대입
sb.Append(queue.Peek() + ">");
// 최종 결과 출력
sw.WriteLine(sb.ToString());
sr.Close();
sw.Close();
후기
이번에는 Queue가 아니라 Queue<int>를 사용해서 풀어보았는데 using System.Collections;을 사용하지 않아도 될 뿐만 아니라 지난번처럼 temp = (int) queue.Dequeue();로 처리할 필요 없이 그냥 temp = queue.Dequeue();를 사용해도 된다. 알아가는 재미가 바로 이것인 듯 하다.
'소프트웨어 개발 > 코딩테스트(기성 문제)' 카테고리의 다른 글
백준알고리즘 2738번 행렬 덧셈 C# (0) | 2025.04.04 |
---|---|
백준알고리즘 12789번 도키도키 간식드리미 C# (0) | 2025.04.03 |
백준알고리즘 2164번 카드2 C# (0) | 2025.04.01 |
백준알고리즘 11659번 구간 합 구하기 4 C# (0) | 2025.03.31 |
백준알고리즘 10828번 스택 C# (0) | 2025.03.30 |