본문 바로가기
Problem Solving

[C++] [11866] 요세푸스 문제 0

by tls1107 2021. 7. 25.
728x90
반응형


문제 풀기 전 생각 : 

/*
문제를 보니 큐를 사용하는 문제인듯 한데
그렇게 안 풀었다...그래서 헤맸는지도 모르겠다.
배열에 숫자들을 저장 후
와일 반복문으로 출력한 숫자의 갯수가 입력받은 n이 될때까지 반복한다.
k번째 숫자부터 출력을 시작한다. 출력이 완료된 숫자는 0으로 만든다. 
그리고 다음 반복으로 넘어간다.
다음 반복에서 현재 위치한 숫자가 0이라면 패스한다.
만약 3칸을 이동하지 않은 상태이고 숫자가 0도 아니라면 
다음칸으로 넘어가고 카운트를 1증가시킨다.
카운트가 3이 될때마다 출력한다. 출력후 카운트를 0으로 만든다.
*/

#include <iostream>
using namespace std;

int main() {
    int n,k,count=0;
    cin >> n;
    cin >> k;
    int arr[n];
    int c=k,i=k-1;

    for(int j=0 ; j<n ; j++) arr[j] = j+1;

    cout << "<";
    while(count < n){
      if(arr[i] == 0){
        i = (i+1)%n;
      }
      else if(c != k){
        i = (i+1)%n;
        c++;
      }
      else{
        cout << arr[i];
        if(count != n-1) cout << ", ";
        arr[i] = 0;
        count++;
        c=1;
      }
    }
    cout << ">";
    
    return 0;
}

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

 

11866번: 요세푸스 문제 0

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

www.acmicpc.net


풀 때 어려웠던 점 또는 느낀점 :

큐를 사용할 걸 그랬다.

간단한 방법을 알고 싶다!!

개선방안으로 고고슝


개선방안 :

#include<stdio.h>
#include<algorithm>
#include<queue>
using namespace std;
int main(){
	int n, k;
	queue<int> q;
	scanf("%d%d", &n, &k);
	printf("<");
	for(int i=1; i<=n; i++) q.push(i);
	while(q.size()>1){
		for(int j=0; j<k-1; j++){
			q.push(q.front());
			q.pop();
		}
		printf("%d, ", q.front());
		q.pop();
	}
	printf("%d>", q.front());
}

오호 꼬리물기 처럼 구현했네요

저렇게 풀수도 있구나 간단하네 ㅠㅠ

내 머리를 탓합시다

컨테이너 사용을 습관화 해야겠네요

728x90
반응형

댓글