FIXPAREN 통과가 안되요. TEST CASE 있으신분 도와주세요 ㅜ.ㅜ

  • ifthenelse
    ifthenelse

    FIXPAREN

    나름대로 이런저런 테스트 케이스로 테스트했는데, 정상적으로 출력됩니다.
    알고스팟에 넣으면 오답처리 되는데, 테스트케이스나 소스상에 조언 부탁드려 봅니다.

    package me.forklift.y2016;
    
    import java.util.Scanner;
    import java.util.Stack;
    
    public class FIXPAREN {    
    
        public static void main(String[] args) {
    
            Scanner sc = new Scanner(System.in);
            int cases = Integer.valueOf(sc.nextLine()).intValue();
            String[] arr = new String[cases];
            String[] answers = new String[cases];
    
            for (int xx = 0; xx < cases; xx++) {
                arr[xx] = sc.nextLine();          
                answers[xx] = solve(arr[xx]);
            }
    
            for (String answer : answers) {
                System.out.println(answer);
            }
    
        }
    
        public static String solve(String arr) {
            Stack<Integer> stack = new Stack<Integer>();
            String expression = arr.split(" ")[0];
            String priority = arr.split(" ")[1];
    
            String answer = "";
            String str = "";
    
            for(int ii = 0; ii < expression.length(); ii++) {
                char currCh = expression.charAt(ii);
                int currId = getParenthesislId(currCh);
    
                //여는 기호라면 스택에 저장
                if (isOpenParenthesis(currCh))
                    stack.push(currId);
                else {
                    //스택에 있는 값과 현재값중 우선순위가 높은 ID 선택
                    int choosedParenthesis = getNeedParenthesisId(stack.pop(), currId, priority);
    
                    //해당 ID를 기반으로 문자열 생성               
                    str = makeString(choosedParenthesis, str);
                }
    
                //스택이 비어있는경우, 블럭이 끝났으므로 답에 append
                if (stack.isEmpty()) {
                    answer += str;
                    str = "";
                }                
            }
    
            return answer;
        }
    
        //기호 ID에 따른 문자열 생성
        public static String makeString(int id, String str) {
            switch(id) {
            case 0 : return "<" + str + ">";
            case 1 : return "(" + str + ")";
            case 2 : return "{" + str + "}";
            case 3 : return "[" + str + "]";
            default : return "";
            }
        }
    
        //기호별로 ID부여
        public static int getParenthesislId(char ch) {
            String symbol = String.valueOf(ch);
            return "<>".contains(symbol)? 0 :
                   "()".contains(symbol)? 1 :
                   "{}".contains(symbol)? 2 :    
                   "[]".contains(symbol)? 3 : -1;
        }
    
        //여는 기호인지 판단
        public static boolean isOpenParenthesis(char ch) {
            return "[{<(".contains(String.valueOf(ch));
        }
    
        //닫는 기호인지 판단
        public static boolean isCloseParenthesis(char ch) {
            return "]}>)".contains(String.valueOf(ch));
        }
    
        //입력된 두개의 기호를 우선순위에 따라 비교
        public static int getNeedParenthesisId(int stored, int current, String priority) {
            for(int ii = 0; ii < priority.length(); ii++) {
                int id = getParenthesislId(priority.charAt(ii));
                if (stored == id) return stored;
                if (current == id) return current;
            }
            return -1;
        }
    }
    

    8년 전
2개의 댓글이 있습니다.
  • hyunhwan
    hyunhwan
    1
    (<><>{}) <({[

    이걸 넣으면 입력한 그대로 나와야 하는데 그렇질 않습니다. makeString부분이 잘못 구현 된 것 같네요.


    8년 전 link
  • ifthenelse
    ifthenelse

    @hyunhwan님 감사합니다.
    덕분에 해결했습니다.
    문자열 만드는 방식에서 array를 채우는 방식으로 변경했습니다.


    8년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.