본문 바로가기
  • 원하는 게 있으면 주문을 말해봐~ 디딩 보딩 디보디보딩🎶
알고리즘

[백준/c++] 1158번 요세푸스 풀이(실버4)

by 딩보 2024. 1. 8.

 

문제

https://www.acmicpc.net/problem/1158

 

1158번: 요세푸스 문제

첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)

www.acmicpc.net

 

 

풀이

1부터 n의 연속된 자연수 배열을 원형큐 형태로 배치하였을 때 k번째 숫자를 계속 제거해야 하는 문제이다.

리스트에서 중간 숫자를 계속 삭제해야 하는 문제이기 때문에 c++의 list(linked list)를 사용하였다.

알고리즘은 매우 간단하게 짰다.  1부터 n의 리스트를 생성한 후, 리스트의 값이 전부 사라질 때까지 반복문을 돌려 k번째 반복일 때 iter가 가리키는 출력과 동시에 삭제했다.

 

코드

#include <iostream>
#include <list>
#include <string>
using namespace std;

int main()
{
	int n, k, i=1;
	list<int> li;
	cin >> n >> k;


	for (int i = 1; i <= n; i++) {
		li.push_back(i);
	}

	list<int>::iterator iter = li.begin();

	cout << "<";
	while (li.size()>1) {
		if (i%k == 0) {
			cout << *iter << ", ";
			iter = li.erase(iter);
		}
		else
			iter++;

		if (iter == li.end())
			iter = li.begin();

		i++;
	}

	cout << *iter << ">";
	return 0;
}

'알고리즘' 카테고리의 다른 글

[백준/c++] 2493번 탑 풀이(골드5)  (2) 2024.01.12
[백준/c++] 5397번 키로거 풀이(실버2)  (0) 2024.01.08