본문 바로가기
백준 문제 풀이 & C++ 공부

백준 11866번 C++

by daisy0461 2021. 9. 1.

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

 

11866번: 요세푸스 문제 0

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

www.acmicpc.net

다른 블로그 글들을 찾아보았는데 상위권에 있는 글들이 큐로 풀어져있었습니다.

저는 완전히 다른 방식으로 문제를 풀어서 나름 공부가 되었던 것 같습니다.

 

큐를 통해서 코딩을 한 것보다 제 코드가 더럽긴 하지만 제 코드를 보고 이렇게도 가능하구나를

한번 느끼셨으면 좋겠습니다.

 

저는 정말 1차원적으로 생각을 했습니다. 이미 없어진 사람은 없애고 넘으면 다시 원점으로 가서 숫자를 세는 방식을
채택했습니다.

 

코드는 길지만 아마 코드를 읽어보신다면 이해는 빠르게 될 것입니다.

 

#include <iostream>
#include<algorithm>
#include<vector>

using namespace std;

int main() 
{
	int n, k;		//n = 사람 수, k = 없어지는 순번의 사람
	cin >> n >> k;

	vector<int> a;
	

	for (int i = 0; i < n; i++) {		//1부터 n까지 사람을 더함.
		a.push_back(i+1);
	}

	vector<int> b;
	int count;
	int savej = 0;

	for (int i = 0; i < n; i++) {
		count = k;

		for (int j = savej; count != 0; j++) {
			//i가 n을 넘을 경우 -> i를 0으로 다시 보내야함.
			if (j >= n) {
				j -= n;
			}

			//0을 만나면 지나쳐야함.
			if (a[j] == 0) {
				continue;
			}
			else 
			{
				count--;
				if (count == 0) {
					b.push_back(a[j]);
					a[j] = 0;				//0으로 만들어줘서 넘길 수 있도록 함.
				}
			}

			savej = j; 
		}
	}

	cout << "<";
	for (int i = 0; i < n; i++) {
		if (i == n - 1) {
			cout << b[i] << ">";
		}
		else {
			cout << b[i] << ", ";
		}
	}
}

 

'백준 문제 풀이 & C++ 공부' 카테고리의 다른 글

백준 1003번 C++  (0) 2021.09.12
백준 11651번 C++  (0) 2021.09.03
백준 18111번 C++  (0) 2021.09.01
백준 10845번 C++  (0) 2021.08.29
백준 10828번 C++  (0) 2021.08.19