importjava.util.ArrayList;importjava.util.Scanner;interfaceStack{charpop();// pop 하기voidpush(chartext);voiddisplay();//출력 하기intgetSize();//stack sizebooleanisEmpty();// Stack이 비어있는지 검사booleanisFull();//Stack이 꽉 찼는지 검사intgetTop();//현재 top 값 구하기//public boolean isFirstPop(); //오른쪽 괄호 만나서 처음으로 pop했는지 검사}classStackDtoimplementsStack{inttop=-1;char[]stackText;chartext;intsize;booleanisFirstPop=true;booleanisSingle=true;@OverridepublicintgetTop(){returntop;}booleanisSingle(){returnisSingle;}voidsetSingle(booleansingle){isSingle=single;}StackDto(intsize){this.size=size;stackText=newchar[size];}booleanisFirstPop(){returnisFirstPop;}voidsetFirstPop(booleanfirstPop){isFirstPop=firstPop;}@Overridepubliccharpop(){//top--;// System.out.println("pop 되었습니다.");if(isEmpty()!=true){//스택이 비어있지 않다면 pop 실행returnstackText[top--];}else{System.out.println("stack이 이미 비어있습니다.");return0;}}@Overridepublicvoidpush(chartext){this.text=text;stackText[++top]=text;}@Overridepublicvoiddisplay(){if(!isEmpty()){for(inti=0;i<top;i++){System.out.print(stackText[i]+" ");}System.out.println();}else{System.out.println("스택이 비어있습니다.");}}@OverridepublicintgetSize(){returnstackText.length;}@OverridepublicbooleanisEmpty(){if(top!=-1){returnfalse;}else{// System.out.println("스택이 비어있습니다. ");returntrue;}}@OverridepublicbooleanisFull(){if(top==stackText.length-1){// System.out.println("스택이 꽉 찼습니다.");returntrue;}else{System.out.println("stack이 Full 입니다.");returnfalse;}}}publicclassMain{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);//System.out.println("샘플 갯수 입력 ");//int cnt = 2;intcnt=sc.nextInt();//갯수 입력// int cnt = 3;StackDtostack;//stackintresultPair=0;//마지막 결과 괄호 짝 번호를 위한 수ArrayList<String>finalResultList=newArrayList<>();String[]inputTexts=newString[cnt];//들어갈 괄호String[]priorityTexts=newString[cnt];//우선순위 괄호intstackEmptyCheckNum=0;//고쳐진 괄호가 들어갈 자리 index 값charpopChar=0;//stack에 pop 한 값 저장intpopPriorityValue=0;//pop한 괄호의 우선순위intchangeRightPriorityValue=0;//오른쪽 괄호의 우선 순위charrightParenthese=0;//stack에 있는 오른쪽 괄호charchangeRightParenthese=0;//비교를 위해 오른쪽 괄호를 왼쪽 괄호로 변경charresultParenthese=0;//우선순위 결과 괄호intwhereRightParenthese=0;for(inti=0;i<cnt;i++){// 입력 받기StringinputText=sc.next();StringpriorityText=sc.next();if(inputText.length()%2!=0){i--;}else{inputTexts[i]=inputText;//배열 안에 저장priorityTexts[i]=priorityText;}}// inputTexts[0] = "(>{(>>";// priorityTexts[0] = "({<[";// inputTexts[0] = "{(>>(>";// priorityTexts[0] = "({<[";// inputTexts[1] = "<>";// priorityTexts[1] = "({<[";//// inputTexts[2] = "<}<)({<}]>";// priorityTexts[2] = "({<[";// for (int i = 0; i < inputTexts.length; i++) {//입력 된 것 보기// System.out.println(inputTexts[i] + " " + priorityTexts[i]);// }for(inti=0;i<inputTexts.length;i++){//inputText 갯수 만큼 수행//잘못 된 문자열 Stack으로 입력 받기// System.out.println("입력 된 갯수 : " + inputTexts[i].length());if(inputTexts[i].length()%2!=0){continue;}else{stack=newStackDto(inputTexts[i].length());//Stack 생성char[]resultTexts=newchar[inputTexts[i].length()];//결과 저장for(intj=0;j<inputTexts[i].length();j++){// 입력된 괄호 Stack에 쌓기//왼쪽 괄호 일 때if(inputTexts[i].charAt(j)=='{'||inputTexts[i].charAt(j)=='('||inputTexts[i].charAt(j)=='<'||inputTexts[i].charAt(j)=='['){stack.push(inputTexts[i].charAt(j));if(stack.getTop()==0){stack.setSingle(true);}if(stack.getTop()>0){stack.setSingle(false);}}else{//오른쪽 괄호를 만나면// 스택에 있는 괄호와 우선순위를 따진다.//다중 괄호가 있으면 새로 바뀐 괄호를 저장할 위치를 고른다.if(stack.isEmpty()!=true){//스택이 비어있지 않다면resultPair=stack.getTop()+stackEmptyCheckNum;//stack 의 top 값 저장}else{//스택이 비어있다면resultPair=stack.getTop()+1+stackEmptyCheckNum;}// resultPair=stack.getTop()+stackEmptyCheckNum;if(stack.isFirstPop()&&stack.isSingle()!=true){whereRightParenthese=resultPair*2+1;stack.setFirstPop(false);}// else if(stack.isSingle()==true)// {// resultPair= stackEmptyCheckNum;// }// whereRightParenthese = stack.getTop();popChar=stack.pop();//stack에 pop 한 값 저장// System.out.println("pop 한 값 : " + popChar);// System.out.println("top의 값 : " + stack.getTop());popPriorityValue=0;//pop한 괄호의 우선순위changeRightPriorityValue=0;//오른쪽 괄호의 우선 순위rightParenthese=inputTexts[i].charAt(j);//stack에 있는 오른쪽 괄호switch(rightParenthese){case')':changeRightParenthese='(';break;case'}':changeRightParenthese='{';break;case'>':changeRightParenthese='<';break;case']':changeRightParenthese='[';break;}//괄호 비교 후 변경된 오른쪽 괄호를 우선순위에 맞는 왼쪽 괄호로 변경// if (popChar != changeRightParenthese) {//괄호가 서로 다를 때//우선순위를 따진다.for(intk=0;k<priorityTexts[i].length();k++){if(popChar==priorityTexts[i].charAt(k)){//pop 한 괄호와 우선순위 괄호가 같을 때popPriorityValue=k;//pop한 괄호의 우선순위}if(changeRightParenthese==priorityTexts[i].charAt(k)){changeRightPriorityValue=k;}}if(popPriorityValue<changeRightPriorityValue){//pop한 괄호(왼쪽괄호)가 우선순위 가 높을 때resultParenthese=popChar;switch(resultParenthese){case'{':rightParenthese='}';break;case'[':rightParenthese=']';break;case'(':rightParenthese=')';break;case'<':rightParenthese='>';break;}}elseif(popPriorityValue>changeRightPriorityValue)//오른쪽 괄호가 우선순위가 높을 때{//왼쪽괄호를 오른쪽 괄호 형태로 바꿔준다.resultParenthese=changeRightParenthese;}elseif(popPriorityValue==changeRightPriorityValue){//우선순위가 같을 때resultParenthese=popChar;switch(resultParenthese){case'{':rightParenthese='}';break;case'[':rightParenthese=']';break;case'(':rightParenthese=')';break;case'<':rightParenthese='>';break;}}if(stack.isEmpty()!=true&&stack.isSingle()!=true){//stack이 비어있지 않을 경우// whereRightParenthese = stackEmptyCheckNum + (inputTexts[i].length() - 1);resultTexts[resultPair]=resultParenthese;resultPair=whereRightParenthese-resultPair;//(inputTexts[i].length() - 1) - resultPair;resultTexts[resultPair]=rightParenthese;//System.out.println(resultParenthese + "" + rightParenthese);}elseif(stack.isEmpty()==true&&stack.isSingle()==true){//stack이 비어있을 경우resultTexts[stackEmptyCheckNum++]=resultParenthese;resultTexts[stackEmptyCheckNum++]=rightParenthese;}elseif(stack.isEmpty()==true&&stack.isSingle()!=true){// 다중 괄호 이면서 마지막 괄호 처리resultTexts[resultPair]=resultParenthese;resultPair=whereRightParenthese-resultPair;//(inputTexts[i].length() - 1) - resultPair;resultTexts[resultPair]=rightParenthese;stackEmptyCheckNum+=whereRightParenthese+1;}//}}Stringresult="";// stack.display();// System.out.println("하이");for(intb=0;b<resultTexts.length;b++){// System.out.print(resultTexts[b]);result=result+resultTexts[b];}// System.out.println();finalResultList.add(result);stackEmptyCheckNum=0;}// System.out.println("bye");for(into=0;o<finalResultList.size();o++){System.out.println(finalResultList.get(o));}}}}
RTE(nonzero return code) 라는 오류가 나오는데요. 왜그런지 모르겠어요..
뭐가 문제일까요? 그냥 이클립스에서 돌리면 잘 되는데 말이죠...
여기서 답안제출 할 때만 뭔가 문제가 나오네요..ㅠ
혹시 괄호 숫자가 홀수 갯수 일 때 문제가 있는가 싶어서
홀수 일 때 다시 입력 받도록 코드를 수정했는데도 그대로이네요 ㅠㅠ
역시 다른 예제를 넣으니깐 문제점이 있더군요....
그래서 새로 문제 해결해서 돌렸는데요.
이번에는 길게 해도 제대로 잘 되는데 답안제출하면 오답이라고 뜨네요.. 그래서 그런데 이거 input data를 알 수 없나요??
어떤 걸 넣어서 오류가 나왔는지 확인하고 싶은데 그런 기능이 없는거 같아서요!
nhs0912
FIXPAREN 문제입니다. RTE 런타임오류가 나오는데 모르겠네요.
아래는 코드입니다.
RTE(nonzero return code) 라는 오류가 나오는데요. 왜그런지 모르겠어요..
뭐가 문제일까요? 그냥 이클립스에서 돌리면 잘 되는데 말이죠...
여기서 답안제출 할 때만 뭔가 문제가 나오네요..ㅠ
혹시 괄호 숫자가 홀수 갯수 일 때 문제가 있는가 싶어서
홀수 일 때 다시 입력 받도록 코드를 수정했는데도 그대로이네요 ㅠㅠ
8년 전