[level2] 연속된 부분 수열의 합

김형진·2023년 6월 13일
0

시간 복잡도를 최소로 하기 위해 단 한 번의 순회만으로 답을 찾아야 하는 문제이다.
투포인터를 사용했으며, 길이가 같은 부분 수열의 경우 앞에 있는 수열의 인덱스를 리턴해야 하기 때문에 조건을 만족하는 이전의 부분수열의 길이를 기억하는 것을 빼먹지 않았어야 했다.

public class Main {

    public static void main(String[] args) {
        int[] arr = {2, 2, 2, 2, 2};
        int k = 6;
        System.out.println(Arrays.toString(solution(arr,k)));
    }

    public static int[] solution(int[] arr, int k){
        int start = 0;
        int end = 0;
        int sum = arr[0];
        int[] result = new int[2];
        int minLength = Integer.MAX_VALUE;

        while(true){

            if(sum < k){
                end++;
                if(end > arr.length-1) break;
                sum += arr[end];
            }else if(sum == k){
                if(end - start < minLength){
                    result[0] = start;
                    result[1] = end;
                    minLength = end-start;
                }
                sum -= arr[start];
                start++;
            }else{
                sum -= arr[start];
                start++;
            }
        }

        return result;
    }
}
  1. end인덱스가 끝 점에 닿아도 sum이 k를 초과하는 경우 start인덱스를 늘려가며 조건에 맞는 부분수열을 끝까지 찾아야 하기 때문에 end가 arr의 index를 초과했을 때 while문을 break해야 한다.
  2. 조건을 만족하는 이전 부분수열의 길이를 기억한다.
  3. start를 늘리는 경우 start지점의 수를 빼주고, end를 늘리는 경우 end지점의 수를 더한다.
profile
히히

0개의 댓글