RTE (nonzero return code)-Java 도와주세요..ㅠ

  • euihyeok.lee
    euihyeok.lee

    시작한지 얼마 안되서 WEIRD 문제를 풀고 있습니다.
    그동안 C로 풀다가 이 문제는 hashset의 유혹에 Java로 풀었는데요,
    RTE 에러 관련해서 좀 찾아보고 이방법 저방법 다써봤는데..
    안되네요.. 고수님들의 도움 부탁드립니다. ㅠ

    또는 C에서 Hashset 처럼 간단한 가변크기의 O(1) 탐색이 가능한 무공이 있다면 팁을 부탁드려도 될런지요..?

    package com.Algospot.Weird;
    
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.Scanner;
    
    public class Main {
        static int tk = 0;
        static int divisors[];
        private static Scanner scan;
        static HashSet<Integer> orig;
        static HashSet<Integer> tempset;
        public static void main(String[] args) {
            scan = new Scanner(System.in);
            orig=new HashSet<Integer>();
            tempset=new HashSet<Integer>();
            divisors=new int[50];
            int cases = scan.nextInt();
            while (cases-- > 0) {
                boolean flag=false;
                for(int i=0;i<divisors.length;i++) divisors[i]=0;
                int num = scan.nextInt();
                devide(num);
                if(isexeed(num))
                    if(verify(num))
                        flag=true;
                if(flag==true) System.out.println("weird");
                else System.out.println("not weird");
            }
        }
    
        private static boolean verify(int num) {
            orig.clear();
            for(int i=0;i<tk;i++){
                if(orig.isEmpty()){
                    orig.add(divisors[i]);
                    continue;
                }
                Iterator<Integer> key=orig.iterator();
                tempset.clear();
                while(key.hasNext()){
                    int sumnum=key.next();
                    tempset.add(sumnum+divisors[i]);
                }
                if(tempset.contains(num)||orig.contains(num)) return false;
                else orig.addAll(tempset);
            }
            return true;
        }
    
        static void devide(int n) {
            tk = 0;
            for (int i = 1; i <= (n / 2); i++)
                if (n % i == 0)
                    divisors[tk++] = i;
        }
        static boolean isexeed(int num){
         int i=0,sum=0;
         for(i=0;i<tk;i++){
             sum+=divisors[i];
         }
         if(sum>num) return true;
         else return false;
     }
    
    }
    

    9년 전
4개의 댓글이 있습니다.
  • nosiar
    nosiar

    알고스팟 온라인 저지/첫 번째 문제 풀기를 참조하세요.


    9년 전 link
  • euihyeok.lee
    euihyeok.lee

    패키지 명을 빼고 해도 여전히 RTE 에러가 나네요..


    9년 전 link
  • euihyeok.lee
    euihyeok.lee

    약수 배열이 50인게 문제였네요.. 제일 많은 약수(약200개) 기준으로 잡았더니 RTE는 통과했는데 이젠 momory exceed가..
    근데 암만 봐도 65MB는 안넘게 생겼는데 이상하네요..
    HashSet이 제일 많이 잡힐때가 약 50만개 쫌 안되는데, int*50만 해도 괜찮은데.. 아.. 어렵네요..


    9년 전 link
  • 일루
    일루

    isexeed가 계속 false면 tempset이 초기화가 안되지 않나요? 대충만 봐서 잘 모르겠지만;;


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