packagehello;importjava.util.Arrays;importjava.util.Scanner;importjava.util.Stack;publicclassPatternMatch{publicstaticvoidmain(String[]args){Scannerinput=newScanner(System.in);intrepeat=0;Stack<Character>open=newStack<>();repeat=input.nextInt();input.skip("[\\r\\n]+");while(repeat-->0){open.clear();String[]buf=input.nextLine().split(" ");char[]data=buf[0].toCharArray();char[]priority=buf[1].toCharArray();char[]result=newchar[data.length];intstackCount=0;for(inti=0,n=data.length;i<n;i++){if(openTag(data[i])){// openTag일 때result[i]=(data[i]);open.push(data[i]);stackCount=i;}elseif(closeTag(open.peek(),data[i])){// closeTag면서 매치가 되었을 때result[i]=(data[i]);open.pop();stackCount-=1;}else{//closeTag 매치가 안되었을 떄stackCount=matchTag(result,priority,open.peek(),data[i],stackCount,i);open.pop();}}for(inti=0;i<result.length;i++){System.out.print(result[i]);}System.out.println();}// while}// mainpublicstaticbooleanopenTag(charch){if(ch=='('||ch=='{'||ch=='['||ch=='<'){returntrue;}returnfalse;}publicstaticbooleancloseTag(Characteropen,charch){switch(ch){case')':returnopen.equals('(');case'}':returnopen.equals('{');case']':returnopen.equals('[');case'>':returnopen.equals('<');default:returnfalse;}}publicstaticcharreverseTag(charch,booleanplus){if(plus==true){if(ch=='('){ch+=1;returnch;}ch+=2;}elseif(plus==false){if(ch==')'){ch-=1;returnch;}ch-=2;}returnch;}publicstaticintmatchTag(char[]result,char[]priority,Characteropen,Characterch,intopenLocation,intcloseLocation){CharacterreverseChar=reverseTag(ch,false);CharacterreverseOpen=reverseTag(open,true);intopenPriority=0;intchPriority=0;for(inti=0;i<4;i++){// 0이 가장 우선순위가 높음if(open.equals(priority[i])){openPriority=i;}if(reverseChar.equals(priority[i])){chPriority=i;}}if(openPriority>chPriority){//ch의 우선순위가 높을 때 result[openLocation]=reverseChar;result[closeLocation]=ch;}elseif(openPriority<chPriority){//open의 우선순위가 높을 때result[closeLocation]=reverseOpen;}returnopenLocation-1;}}// class
pyeonbun
자주 글을 올려서 정말 죄송합니다.
문제 주소 : FIXPAREN
문제이해
오픈태그일 때는 저장하고 닫는 태그일 때 오픈태그랑 비교해서 우선순위를 확인해 변경하는걸로 문제를 이해했습니다
메소드 설명
openTag는 오픈 태그일 때 true 를 반환하고 아니면 false를 반환 합니다
closeTag는 닫는 태그일 때 오픈 태그랑 일치한다면 true 를 반환하고 아니면 false를 반환 합니다
matchTag는 닫는 태그가 오픈 태그랑 일치하지 않을 때 오픈태그랑 우선순위를 확인해 변경하는 로직입니다
reverseTag는 닫는 태그를 오픈 태그로 변환시켜서 반환하거나 그 반대에 경우로 반환에 줍니다
질문사항
8년 전