백준 1920번 수찾기 메모리 초과 발생

byeol·2023년 2월 10일
0

메모리 초과 발생
재귀함수를 호출하지 않고 while문을 통해서 계속 돌도록 바꿔야할 거 같다.

import java.util.*;
import java.io.*;

class Main{

    public static void main(String[] args)throws IOException{

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = null;

        int N = Integer.parseInt(br.readLine());
        st= new StringTokenizer(br.readLine()," ");
        int[] arr = new int[N];
        for(int i=0;i<N;i++){
            int n = Integer.parseInt(st.nextToken());
            arr[i]=n;
        }

        Arrays.sort(arr);

        int M = Integer.parseInt(br.readLine());
        st= new StringTokenizer(br.readLine()," ");
        for(int i=0;i<M;i++){
            int m = Integer.parseInt(st.nextToken());
            int result = Search(m,arr);
            bw.write(Integer.toString(result)+"\n");
        }
        bw.flush();
        bw.close();
        br.close();

    }

    public static int Search(int n, int[] arr) {
        int length = arr.length/2;
        if(arr[length]==n) return 1;
        else if(length==0 && arr[length]!=n) return 0;
        else if(arr[length]>n) return Search(n, Arrays.copyOfRange(arr, 0, length));
        else return Search(n, Arrays.copyOfRange(arr, length/2 + 1, arr.length ));

    }


}

개선한 방법 재귀함수 이용하지 않음

import java.util.*;
import java.io.*;

class Main{

    public static void main(String[] args)throws IOException{

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = null;

        int N = Integer.parseInt(br.readLine());
        st= new StringTokenizer(br.readLine()," ");
        int[] arr = new int[N];
        for(int i=0;i<N;i++){
            int n = Integer.parseInt(st.nextToken());
            arr[i]=n;
        }

        Arrays.sort(arr);

        int M = Integer.parseInt(br.readLine());
        st= new StringTokenizer(br.readLine()," ");
        for(int i=0;i<M;i++){
            int m = Integer.parseInt(st.nextToken());
            int result = Search(m,arr);
            bw.write(Integer.toString(result)+"\n");
        }
        bw.flush();
        bw.close();
        br.close();

    }

    public static int Search(int n, int[] arr) {
        int l =0;
        int r = arr.length-1;
        while(l<=r) {
            int mid = (r+l)/2;
            if(arr[mid]==n) return 1;
            else if(arr[mid]>n) r = mid-1;
            else l = mid+1;
        }
        return 0;

    }


}
profile
꾸준하게 Ready, Set, Go!

0개의 댓글

관련 채용 정보