책의 답안과 완전히 일치하지는 않지만,
포함해야할 조건들을 포함한 것 같은데
왜 오답이 나올까요..
#include<stdio.h>#include<string.h>#include<string>#include<algorithm>#include<iostream>std::stringnum;intcache[10005];//해당 조각(begin ~ end) 의 난이도 계산intclassify(intbegin,intend){//해당 조각 가져오기std::stringP=num.substr(begin,end-begin+1);intfirst=P[0];intsec=P[1];intdiff=sec-first;boolcheck=false;//난이도 1인지 확인if(diff==0){for(inti=1;i<(end-begin);i++){if(P[i]==P[i+1])check=true;if(!check)break;}if(check)return1;check=false;}//난이도 2인지 확인 (단순증가)elseif(diff==1){for(inti=1;i<(end-begin);i++){if(P[i+1]-P[i]==1)check=true;if(!check)break;}if(check)return2;check=false;}//난이도 2인지 확인 (단순감소)elseif(diff==-1){for(inti=1;i<(end-begin);i++){if(P[i+1]-P[i]==-1)check=true;if(!check)break;}if(check)return2;check==false;}//난이도 4인지 확인for(inti=1;i<(end-begin+1);i++){if(i%2==0)check=P[i]==first;elsecheck=P[i]==sec;if(!check)break;}if(check)return4;check=false;//난이도 5인지 확인for(inti=1;i<(end-begin);i++){if(P[i+1]-P[i]==diff)check=true;if(!check)break;}if(check)return5;//다 아니면 난이도 10return10;}//시작 index가 begin 일 때 최소난이도 반환intmemorize(intbegin){int&ret=cache[begin];//cache에 저장된 값 있으면 바로 반환if(ret!=-1)returnret;intavail=num.size()-begin;if(avail<3)return0;//잔여 num의 갯수에 따라 가능한 경우를 나누고, 그 중 최소값을 returnif(avail==3){returnret=classify(begin,begin+3)+memorize(begin+3);}if(avail==4){inta=classify(begin,begin+3)+memorize(begin+3);intb=classify(begin,begin+4)+memorize(begin+4);returnret=std::min(a,b);}else{inta=classify(begin,begin+3)+memorize(begin+3);intb=classify(begin,begin+4)+memorize(begin+4);intc=classify(begin,begin+5)+memorize(begin+5);inttmp=std::min(a,b);returnret=std::min(tmp,c);}}intmain(void){intC;scanf("%d",&C);for(inttc=0;tc<C;tc++){//초기화num.erase(0,num.length());memset(cache,-1,sizeof(cache));std::cin>>num;printf("%d\n",memorize(0));}return0;}
8년 전
0개의 댓글이 있습니다.
정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면
온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야
합니다. 현재 문제를 푸셨습니다.
dsj
책의 답안과 완전히 일치하지는 않지만,
포함해야할 조건들을 포함한 것 같은데
왜 오답이 나올까요..
8년 전