<배열,연결리스트> 백준 1158번 요세푸스 문제
2025. 3. 4. 22:27ㆍ원티드_언리얼RPG 2기/자료구조 스터디
문제접근
중간에 삽입삭제가 빈번하면 리스트가 좋을것같아서 리스트를 두개 만들어서 풀려고했다.
#include <iostream>
#include <list>
using namespace std;
int main()
{
int N, K;
cin >> N >> K;
list<int> numbers;
list<int> yosepus;
//1~N까지 리스트에 숫자 입력받기
for (int i = 1; i <= N; i++)
{
numbers.push_back(i);
}
auto it = numbers.begin();
//리스트의 사이즈가 0일때까지 반복
while (!numbers.empty())
{
for (int i = 1; i < K; i++)
{
it++;
//이터레이터가 범위 초과하면 시작위치로 보냄
if (it == numbers.end())
{
it = numbers.begin();
}
}
//이터레이터가 가리키는게 k번째면 k번째 숫자 yosepus에 넣기
yosepus.push_back(*it);
//K번째 숫자 지우기 numbers.erase(it)
it = numbers.erase(it);
if (it == numbers.end())
{
it = numbers.begin();
}
}
//yosepus 리스트 출력 <3, 6, 2, 7, 5, 1, 4>
cout << "<";
for (auto it = yosepus.begin(); it != yosepus.end(); it++)
{
cout << *it;
if (next(it) != yosepus.end())
{
cout << ", ";
}
}
cout << ">";
}
근데 풀면서도 이렇게 풀면 배열로 푸는게 낫지않나? 싶어서 배열로 풀다가 이상한점을 발견했다. 문제에서 원형큐라는 힌트를 줬는데 큐를 쓸 생각을 미처 못했다. 그래서 원형큐를 이용하는김에 앞뒤 삽입삭제가 빠른 덱과 출력 수열을 담을 벡터를 이용했다.
#include <iostream>
#include <deque>
#include <vector>
using namespace std;
//원형큐니까 덱에 저장
//출력수열은 배열에 저장
int main()
{
int N, K;
cin >> N >> K;
deque<int> numbers;
vector<int> yosepus;
for (int i = 1; i <= N; i++)
{
numbers.push_back(i);
}
while (!numbers.empty())
{
//K번째 원소 맨앞으로 가져오기
for (int i = 1; i < K; i++)
{
//K번째 원소 뒤로 가져오기
numbers.push_back(numbers.front());
numbers.pop_front();
}
//K번째 원소 제거하고 요세푸스에 저장
yosepus.push_back(numbers.front());
numbers.pop_front();
}
cout << "<";
for (auto i = 0; i < yosepus.size(); i++)
{
cout << yosepus[i];
if (i != yosepus.size() - 1)
{
cout << ", ";
}
}
cout << ">\n";
}
'원티드_언리얼RPG 2기 > 자료구조 스터디' 카테고리의 다른 글
이진탐색트리 (0) | 2025.03.17 |
---|---|
<연결리스트> 백준 1406 에디터 (0) | 2025.03.06 |
2주차 배열, 벡터, 연결리스트 (0) | 2025.03.03 |
<덱deque> 백준 1021번 회전하는 큐 (0) | 2025.03.01 |
<스택> 백준 3986번 좋은 단어 (0) | 2025.03.01 |