문제를 간략히 요약하면,
수열이 주어졌을 때 연속된 수를 최소 몇번 뒤집어야 오름차순으로 정렬되는지
물어보는 문제입니다.
제가 작성한 코드는 아래와 같구요,
알고리즘을 설명 드리면,
main 함수 while 안쪽으로 BFS 써서 구현했습니다.
제가 혹시 어떤 부분을 놓치고 있는지...도움주시면 감사하겠습니다.
#include <stdio.h>//#define DEBUGinttestN;intinput[8];intnum_cnt;intcnt=0;intpos=0;inttemp1_input[8];inttemp2_input[8];intfind_sol;#ifdef DEBUGintdebug;#endifintzero[5000000];intl[5000000];intsquare(inta,intb){inti;inttmp=1;if(b==0)return1;else{for(i=0;i<b;i++){tmp=tmp*a;}}returntmp;}intconvert_array_to_int(int*array,intarray_length){inti,sum;sum=0;for(i=0;i<array_length;i++){sum=sum+square(10,array_length-1-i)*array[i];}returnsum;}voidconvert_int_to_array(int*array,intnum,intarray_length){inti;intcntt=array_length-1;while(1){if(cntt<0)break;i=num%10;array[cntt]=i;cntt--;num=(num-i)/10;}}voidcopy_array(int*array1,int*array2,intlength){inti;for(i=0;i<length;i++){array1[i]=array2[i];}}voidenqueue(int*array,intll,intarray_length){l[cnt]=ll;zero[cnt]=convert_array_to_int(array,array_length);cnt++;}intdequeue(int*array){intret;array[0]=zero[pos];ret=l[pos];pos++;returnret;}voidswitch_array(intwidth,intposition,int*array){inti;intN,temp;if((width%2)==0)N=width/2;elseN=((int)(width/2))+1;for(i=0;i<N;i++){temp=array[position+i];array[position+i]=array[position+width-1-i];array[position+width-1-i]=temp;}}intcheck_sequence(int*array,intseq_num){inti=1;for(i=0;i<(seq_num-1);i++){if(array[i]>array[i+1]){i=0;break;}}returni;}intmain(void){inti,idx;intwidth_idx,position_idx;intret;scanf("%d",&testN);for(i=0;i<testN;i++){ret=0;pos=0;cnt=0;find_sol=0;#ifdef DEBUGdebug=0;#endifscanf("%d",&num_cnt);for(idx=0;idx<num_cnt;idx++){scanf("%d",&input[idx]);}/* copy the input value */copy_array(temp1_input,input,num_cnt);if(check_sequence(input,num_cnt)||(num_cnt==1)){printf("0\n");}else{while(1){for(width_idx=2;width_idx<=num_cnt;width_idx++){for(position_idx=0;position_idx<=num_cnt-width_idx;position_idx++){#ifdef DEBUGdebug++;#endifif(ret)convert_int_to_array(temp1_input,temp2_input[0],num_cnt);copy_array(input,temp1_input,num_cnt);switch_array(width_idx,position_idx,input);/* queuing for BFS */if((ret==0))enqueue(input,1,num_cnt);elseenqueue(input,ret+1,num_cnt);if((check_sequence(input,num_cnt))){find_sol=1;break;}}if(find_sol==1)break;}if(find_sol==1)break;/* pop the next value */ret=dequeue(temp2_input);}#ifdef DEBUGprintf("%d, debug:%d\n",l[cnt-1],debug);#elseprintf("%d\n",l[cnt-1]);#endif}}return0;}
hyuk0512
아무래도 특이 case에 문제가 있어서 오답 처리되는 것 같은데,
경계점을 못찾겠네요 ㅠ
문제를 간략히 요약하면,
수열이 주어졌을 때 연속된 수를 최소 몇번 뒤집어야 오름차순으로 정렬되는지
물어보는 문제입니다.
제가 작성한 코드는 아래와 같구요,
알고리즘을 설명 드리면,
main 함수 while 안쪽으로 BFS 써서 구현했습니다.
제가 혹시 어떤 부분을 놓치고 있는지...도움주시면 감사하겠습니다.
9년 전