본문 바로가기
Beakjoon&프로그래머스/Java

[프로그래머스/Java] 연속된 부분 수열의 합

by 현장 2026. 4. 9.

-Code

class Solution {
    public int[] solution(int[] sequence, int k) {
        // 투포인터 셋팅
        int left = 0, right = 0;
        // 현재 시작 셋팅 및 정답 배열의 길이 판별을 위한 변수 셋팅
        int sum = sequence[0], minGap = Integer.MAX_VALUE;
        
        int[] answer = new int[2];
        while (true) {
            if (sum < k) {
                // 비내림차순이므로 현재 합보다 작으면 오른쪽 이동
                right++;
                // 오른쪽 포인터가 범위 넘어감 체크
                // 없으면 Index 에러 발생
                if (right == sequence.length) break;
                sum += sequence[right];
            } else {
                // 합이 k이상인 경우 
                // k와 같고 범위가 더 작으면 저장
                if (sum == k && minGap > right - left) {
                    minGap = right - left;
                    answer[0] = left;
                    answer[1] = right;
                }
                // 왼쪽 포인터 이동
                sum -= sequence[left];
                left++;
            }
        }
        return answer;
    }
}

처음에 투포인터 설정은 맞았으나 sum이 k와 같으면 바로 반환하게 하여 틀렸었습니다.

찾아보니 제가 빼먹고 설계한 부분이 길이가 가장 짧은 배열의 2 포인터를 구하는 것이었습니다. 그래서 탈출을 포인터가 넘어가면 되도록 하고 sum이 k인 범위가 작은 경우만 갱신하도록 하여 O(n)으로 작동하게 하여 해결했습니다.