티스토리 뷰

n명의 사람이 있고, 첫 번째 사람을 기준으로 k번째 사람이 차례로 죽어나갑니다.

이 때 2명이 되면 2명은 살아남습니다. 

조세푸스가 2명 안에 들기 위해 몇 번 째에 있어야 하는지 구하는 문제입니다.

(첫번 째 사람 1번, 시계 방향으로 번호 증가)

 

C++의 list를 이용하여 구현하였습니다.

list의 iterator를 kill이라 하고 처음에 kill = list.begin( ) 으로 잡습니다.

이후 2명이 남을 때까지 kill의 위치의 노드를 지우고 (erase) 노드를 한 칸씩 당기는 것을 반복합니다.

 

코드

#include<iostream>
#include<vector>
#include<list>

using namespace std;

int C, N, K;

void josephus(int n, int k) {
	list<int>survivors;
	for (int i = 1; i <= n; i++)
		survivors.push_back(i);

	list<int>::iterator kill;
	kill = survivors.begin();

	while (n > 2) {
		kill = survivors.erase(kill);
		if (kill == survivors.end())
			kill = survivors.begin();
		n--;
		for (int i = 0; i < k - 1; i++) {
			kill++;
			if (kill == survivors.end())
				kill = survivors.begin();
		}
	}
	cout << survivors.front() << ' ' << survivors.back() << '\n';
}

int main()
{
	cin >> C;
	cout << "\n===========\n";
	while (C--) {
		cin >> N >> K;
		josephus(N, K);
		cout << "\n===========\n";
	}
}

결과

 

'알고리즘 > 알고리즘 문제 해결 전략' 카테고리의 다른 글

19.6 외계 신호 분석  (0) 2021.01.24
19.4 짝이 맞지 않는 괄호  (0) 2021.01.24
부분 합  (0) 2021.01.24
16.4 졸업 학기  (0) 2021.01.17
비트마스크  (0) 2021.01.17
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2025/01   »
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
글 보관함