백준 - 1158 요세푸스 문제

AleXtep·2023년 3월 31일

백준

목록 보기
2/2

요약

  1. 1번부터 n명이 순서대로 원을 이루며 앉음
  2. 자연수 k가 주어지고 순서대로 k번째 사람을 제거함
  3. 모두 제거될때 까지 2번은 반복됨
  4. n,k가 주어지면 제거되는 순서대로 출력

아이디어

  1. n명을 배치해야함
  2. 어디에?
    1. 배열 x(인덱스 중간의 삭제가 힘듦)
    2. 스택 x(한쪽에서만 삽입과 제거가능)
    3. 큐 o (원형을 아래의 그림처럼 전단의 제거를 후단의 삽입으로 생각가능)
  3. 큰 틀을 모델링
    1. 전체큐 입력받음
    2. 전단부터 k번째의 수가 출력되고 제거되어야함
    3. k-1번 (삽입 + 제거) → 출력 + 제거
    4. queue가 empty가 될때까지 위의 과정을 반복

코드작성

#include <queue>
#include <iostream>
using namespace std;

int main()
{
queue <int> q;//queue 선언
int n,k;
cin>>n;
cin>>k;
for(int i=1;i<=n;i++){
    q.push(i);
}//queue 입력
cout<<"<";
while(!q.empty()){

    for(int i=0;i<k-1;i++){
    q.push(q.front());
    q.pop();
    }//k-1번째까지 삽입 + 삭제 반복
    
    cout<<q.front();//k번째 출력
    q.pop();//k번째 삭제

    if(q.empty()){
        break;
    }//,를 위한 예외처리
    cout<<", "; 
}
cout<<">";
return 0;
}
profile
Full-Stack Developer

0개의 댓글