# define _CRT_SECURE_NO_WARNINGS
# include <iostream>
int arr[2000];
int compare(const void *a,const void *b){
return (*(int*)a - *(int*)b);
}
int main(){
int t,i,j;
int a,b,num,pre,L,R,C;
scanf("%d",&t);
for(i=0;i<t;i++){
scanf("%d %d",&a,&b); //a가 N b가 K
num = a-2; //qsort 범위 정해주기위해
pre = 1;
for(j=0;j<a-1;j++){
arr[j] = j+2;
}
arr[a-1] = 2000;
for(j=0;j<a-3;j++){ //두 명 살아남을때 까지
qsort(arr,a,sizeof(int),compare);
R = num;
L=0;
while(L+1<=R){// 2진탐색으로 죽은사람 다음사람찾기 //R이 죽은사람의 다음 사람
if(arr[num]<=pre){ //마지막 번호가 죽었을 때
R=0;
break;
}
C = (L+R)/2;
if(arr[C]>pre)
R=C;
else if(arr[C]<pre)
L=C+1;
}
if(arr[R+b-1]!=2000){ //한 바퀴 아직안돌았을 때
pre = arr[R+b-1];
arr[R+b-1]=2000;
}
else{ // 한 바퀴 돌았을 때
pre = arr[R+b-num-2];
arr[R+b-num-2]=2000;
}
num--;
}
qsort(arr,a,sizeof(int),compare);
printf("%d %d\n",arr[0],arr[1]);
}
return 0;
}
조셉푸스 문제입니다. 이진탐색으로 바로 전 죽은 사람의 다음 순서를 찾아내서 다시 다음 번 죽을 사람을 찾는 방법으로 문제를 풀었습니다. 제가 생각해 볼 수 있는 예제랑 기본 예제는 답이 맞다고 하는데 제가 생각하지 못하는 부분이 무엇인지 모르겠습니다 ㅠㅠ 어느 부분에서 틀린 것인지 알 수 있을까요?
설명을 더 하자면 기본예제 6과 3을 입력으로 받았다고 했을 때 크기 6인 배열을 받아 각 배열에 1~6까지 차례대로 입력해줍니다. 그 후 1이 죽으면 1을 100으로 바꿔주고 정렬을 시킵니다. 그리고 이전에 죽은 사람(pre)에 1을 저장해줍니다. 그러면 현재 배열엔 2 3 4 5 6 100 이 들어가 있습니다. 2~6까지 2진탐색을 돌려 1보다 큰 다음 수를 찾습니다. 2를 찾았다면 3번째 후의 차례가 죽어야 함으로 2칸을 이동한 후 결과 값인 4를 죽입니다. 그리고 똑같이 100으로 값을 변경합니다. 그 후 정렬을 하면 2 3 5 6 100 100 이 되고 pre값은 4가 됩니다. 2~6까지의 숫자를 이진탐색을 돌려 4 다음 순서를 찾습니다. 5를 찾았다면 5에서 2칸 이동 후인 2를 죽입니다. 2를 죽인 후 배열에 들어가있는 수는 3 5 6 100 100 100이 되고 pre값은 2가 됩니다. 이를 한번 더 반복하면 3 5 100 100 100 100이 되고 그러므로 값은 3과 5가 됩니다.
mju6229
조셉푸스 문제입니다. 이진탐색으로 바로 전 죽은 사람의 다음 순서를 찾아내서 다시 다음 번 죽을 사람을 찾는 방법으로 문제를 풀었습니다. 제가 생각해 볼 수 있는 예제랑 기본 예제는 답이 맞다고 하는데 제가 생각하지 못하는 부분이 무엇인지 모르겠습니다 ㅠㅠ 어느 부분에서 틀린 것인지 알 수 있을까요?
설명을 더 하자면 기본예제 6과 3을 입력으로 받았다고 했을 때 크기 6인 배열을 받아 각 배열에 1~6까지 차례대로 입력해줍니다. 그 후 1이 죽으면 1을 100으로 바꿔주고 정렬을 시킵니다. 그리고 이전에 죽은 사람(pre)에 1을 저장해줍니다. 그러면 현재 배열엔 2 3 4 5 6 100 이 들어가 있습니다. 2~6까지 2진탐색을 돌려 1보다 큰 다음 수를 찾습니다. 2를 찾았다면 3번째 후의 차례가 죽어야 함으로 2칸을 이동한 후 결과 값인 4를 죽입니다. 그리고 똑같이 100으로 값을 변경합니다. 그 후 정렬을 하면 2 3 5 6 100 100 이 되고 pre값은 4가 됩니다. 2~6까지의 숫자를 이진탐색을 돌려 4 다음 순서를 찾습니다. 5를 찾았다면 5에서 2칸 이동 후인 2를 죽입니다. 2를 죽인 후 배열에 들어가있는 수는 3 5 6 100 100 100이 되고 pre값은 2가 됩니다. 이를 한번 더 반복하면 3 5 100 100 100 100이 되고 그러므로 값은 3과 5가 됩니다.
10년 전