100년전쟁 런타임 오류 질문입니다.

  • entelechy39
    entelechy39

    100년 전쟁을 풀고 있는데 자꾸 런타임 오류가나서 질문합니다.

    제가 푼방식은 class로 node를 만들어서

    class 배열을 만들고 각각의 node에 귀족들을 할당한 후,

    node에는 자신의 왕이 누군지 알 수 있는 master변수와

    자신의 수하가 누구인지 알 수 있는 Vector변수를 사용한 follower가 있습니다.

    각각의 귀족들은 T명령어가 나왔을 때 자신의 master변수에 1을 더해서 왕을 바꾸고, 자신의 수하들의 master에도 1을 더합니다.

    Q명령어가 나왔을 경우에는 그냥 master%2값만 비교해서 같으면 동맹, 다르면 적으로 나타냅니다.

    제가 직접 동맹 구도를 그려보고 여러 명령어를 입력했을 때는 잘됬는데 여기서 돌리면 런타임 오류가 나네요.

    아 Main쪽에서 change함수를 넣지 않으면 런타임 오류는 안나고 오답만 뜨는데 change함수를 넣었을 경우에는 런타임 오류가 납니다.

    다음은 소스코드 입니다.

    import java.util.Scanner;
    import java.util.Vector;
    
    public class Main {
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
    
            int test = input.nextInt();
    
            for (int t = 0; t < test; t++) {
                int nobleCount = input.nextInt();
                int questionCount = input.nextInt();
    
                //각각의 귀족들이 될 node를 생성한다.
                WOHnode[] node = new WOHnode[nobleCount];
                for(int i=0;i<nobleCount;i++){
                    node[i] = new WOHnode();
                }
    
                //1번과 2번은 왕이므로 자기자신을 master로 한다.
                node[0].setMaster(1);
                node[1].setMaster(2);
    
                for (int i = 0; i < nobleCount-2; i++) {
                    int tempMaster = input.nextInt();
                    int tempFollower = input.nextInt();
    
                    //각각 귀족에게 수하가 누구인지 vector에 저장.
                    node[tempMaster-1].follower.addElement(tempFollower);
    
                    //수하의 왕은 귀족의 왕과 같다.
                    node[tempFollower-1].master = node[tempMaster-1].master;
                }
    
                for(int i = 0 ; i < questionCount ; i++){
                    String question = input.next();
                    if(question.equalsIgnoreCase("T")){
                        //배신할경우 change method 호출.
                        int betrayer = input.nextInt();
                        change(node, betrayer);
                    }else if(question.equalsIgnoreCase("Q")){
                        int t1 = input.nextInt();
                        int t2 = input.nextInt();
    
                        //master%2의 값이 같으면 왕이 같은 경우가 되므로.
                        if(node[t1-1].master%2 == node[t2-1].master%2){
                            System.out.println("Ally");
                        }else{
                            System.out.println("Enemy");
                        }
                    }
                }
            }
            input.close();
        }
    
        static void change(WOHnode[] node, int betrayer){
            //자신의 왕에 +1을 하고 %2를 하면 상대왕이 되므로 +1을 해준다.
            node[betrayer-1].master += 1;
    
            //자신의 수하들에 대해서도 왕을 바꿔준다. 이때 수하의 수하도 바꿔줘야 하므로 재귀함수를 사용한다.
            for (int j = 0; j < node[betrayer-1].follower.Size(); j++) {
                change(node, (int) node[betrayer-1].follower.elementAt(j));
            }
        }
    }
    
    class WOHnode {
        Vector follower;
        int master;
    
        WOHnode(){
            master = 0;
            follower = new Vector();
        }
    }
    

    잘부탁드리겠습니다.


    10년 전
4개의 댓글이 있습니다.
  • JongMan
    JongMan

    입력이 큰 경우에 스택오버플로우 에러가 나는 것 같습니다.


    10년 전 link
  • entelechy39
    entelechy39

    재귀함수에서 나는 경우일까요?


    10년 전 link
  • JongMan
    JongMan

    네 그런 것 같네요. 모든 사람들이 일렬로 쭉 연결되어 있는 경우 change()는 N번 호출될 수 있으니까요.


    10년 전 link
  • entelechy39
    entelechy39

    아하 감사합니다!


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