[210317][백준/BOJ] 1158번 요세푸스 문제
문제
입출력
풀이
STL list로 문제를 해결하였다.
1부터 N까지의 숫자랑 K번째 사람을 제거하기 위한 숫자 K가 주어지며 1부터 N번의 사람이 원을 이루면서 앉아있다.
- 시작번호가 1, 끝번호가 7이며 1부터 7까지의 사람중에 3번째 사람이 제거되었다.
// 1 2 3 4 5 6 7
3 - 3번째 사람이 제거되었으며 다음 번호인 4번을 시작번호로 해서 3번째에 위치한 6번이 제거도었다.
// 4 5 6 7 1 2
6 - 6번째 사람이 제거되었으며 다음 번호인 7번을 시작번호로 해서 3번째에 위치한 사람을 찾아야 하며 총 7명의 사람이 원형으로 앉아있으므로 7번 다음번호는 1번이 된다. 따라서 7번을 시작번호로 해서 3번째에 위치한 2번이 제거되었다.
// 7 1 2 4 5
2 - 이를 반복하면 7, 5, 1, 4번이 제거된다.
// 4 5 7 1
7
// 1 4 5
5
// 1 4
1
// 4
4 - 구현을 할때 주의할만한 점은 n명의 사람이 원형으로 앉아있으므로 커서가 list의 end에 도달하면 커서를 list의 begin으로 보내주면 된다.
if (t == L.end())
t = L.begin();
- 남아있는 사람이 k보다 작을경우를 위해서 위에서 구현한 코드를 t++; 이후에 한번 더 적어주면 된다.
코드
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, m, cnt = 0;
list<int>L;
scanf("%d%d", &m, &n);
for (int i = 1; i <= m; ++i)
L.push_back(i);
list<int>::iterator t = L.begin();
for (int i = 0; i < m; ++i)
{
for (int k = 0; k < n - 1; ++k)
{
if (t == L.end())
t = L.begin();
t++;
if (t == L.end())
t = L.begin();
}
cnt++;
if(cnt==1) cout << "<";
cout << *t;
if (cnt < m) cout << ", ";
else cout << ">";
t = L.erase(t);
}
// 1 2 3 4 5 6 7 3
// 4 5 6 7 1 2 6
// 7 1 2 4 5 2
// 4 5 7 1 7
// 1 4 5 5
// 1 4 1
// 4 4
}
Author And Source
이 문제에 관하여([210317][백준/BOJ] 1158번 요세푸스 문제), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kwkim95/210317백준BOJ-1158번-요세푸스-문제저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)