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

이강혁·2024년 8월 26일
0

프로그래머스

목록 보기
72/82

https://school.programmers.co.kr/learn/courses/30/lessons/178870?language=java

연속된 부분 수열 중 합이 k가 되는 수열을 찾는데 여러 개가 있다면 가장 짧은 수열, 가장 짧은 수열이 여러 개이면 index가 가장 앞에 있는 수열을 찾아서 시작과 끝을 반환하는 문제이다.

class Solution {
    public int[] solution(int[] sequence, int k) {
        int[] answer = {0, sequence.length};

        int start = 0;
        int end = 1;
        int sum = sequence[start];

        while (end <= sequence.length) {
            if (sum < k) {
                if(end < sequence.length) sum += sequence[end++];
                else break;
            } else if (sum > k) {
                sum -= sequence[start++];
            } else if(sum == k) {
                if(answer[1] - answer[0] > end - start - 1){
                    answer = new int[]{start, end - 1};
                }
                else if (answer[1] - answer[0] == end - start - 1 && answer[0] > start) {
                    answer = new int[]{start, end - 1};
                }
                sum -= sequence[start++];
            }
        }

        return answer;
    }
}

start, end를 두고 sum이라는 변수를 선언해서 합을 추적하도록 했다.
answer에는 전체 수열의 시작과 끝+1로 초기화했다.

sum이 k보다 작으면 sequence[end]를 더하고 end를 증가시키고, 크다면 sequence[start]를 빼고 start를 증가시켰다.

만약 값이 같다면 answer에 저장된 인덱스들의 차와 비교해서 업데이트하고, 만약 길이도 같다면 index가 앞에 오는 수열을 저장하도록 했다.
그리고 start를 줄여서 새로운 연산이 되도록 했다.


Java로 코딩테스트를 준비해야해서 간만에 java로 풀어봤는데 python은 무지성으로 변수 저장하고 사용하는게 가능했으나 java는 그게 안 돼서 쉽지 않다.
당분간 java로 푸는 연습을 해야겠다.

profile
사용자불량

0개의 댓글