-
[연결리스트]-기본-요세푸스 문제알고리즘 스터디 01/숙제 2022. 11. 19. 02:55
< 연결리스트 > - < 실버 4 >
https://www.acmicpc.net/problem/1158
1158번: 요세푸스 문제
첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)
www.acmicpc.net
[ 1158 ] 요세푸스 문제
요세푸스 문제는 다음과 같다.
1번부터 N번까지 N명의 사람이 원을 이루면서 앉아있고, 양의 정수 K(≤ N)가 주어진다. 이제 순서대로 K번째 사람을 제거한다. 한 사람이 제거되면 남은 사람들로 이루어진 원을 따라 이 과정을 계속해 나간다. 이 과정은 N명의 사람이 모두 제거될 때까지 계속된다. 원에서 사람들이 제거되는 순서를 (N, K)-요세푸스 순열이라고 한다. 예를 들어 (7, 3)-요세푸스 순열은 <3, 6, 2, 7, 5, 1, 4>이다.
N과 K가 주어지면 (N, K)-요세푸스 순열을 구하는 프로그램을 작성하시오.
:: 입력 ::
ㅁㅁ
:: 출력 ::
ㅁㅁ
리스트로 풀려고 하니까 너무 복잡할 거 같아서
정답 봤는데 야매 리스트에 대한 이해가 좀 부족한 거 같아서 내일 다시 보려고 남김
다시 풀기 도전했는데 40분 걸려서 성공함 !
end() 를 사용하면 맨 뒷 원소가 아닌 맨 뒷 원소의 그 다음 위치를 가리킨다는 걸 인지하고
그 부분을 잘 넘어갈 수 있도록 처리해야함
그래서 반복문을 돌 때
K번 증가시키고 난 뒤의 위치가 end이거나
삭제 후 반환된 위치가 end인지를 체크해서 begin으로 돌려줌정답 코드
#include <iostream> #include <vector> #include <string> #include <list> using namespace std; int main() { int n, k; cin >> n >> k; list<int> circle; for (int i = 1; i <= n; i++) { circle.push_back(i); } list<int>::iterator iter = circle.begin(); vector<int> nums; while (!circle.empty()) { for (int i = 1; i < k; i++) { iter++; if (iter == circle.end()) { iter = circle.begin(); } } nums.push_back(*iter); iter = circle.erase(iter); if (iter == circle.end()) { iter = circle.begin(); } } cout << "<"; for (int i = 0; i < nums.size(); i++) { cout << nums[i]; if (i != nums.size() - 1) cout << ", "; } cout << ">"; }
'알고리즘 스터디 01 > 숙제' 카테고리의 다른 글
[스택]-기본-제로 (0) 2022.11.19 [스택]-연습-스택 (0) 2022.11.19 [연결리스트]-기본-키로거 (0) 2022.11.19 [연결리스트]-연습-에디터 (0) 2022.11.19 [배열]-기본-숫자의 개수 (0) 2022.11.18