| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 | 31 |
- server engineer
- 자바 #자바문법 #자바기초 #참조형 #기본형
- tmax tibero
- 서버 개발자
- 25304번
- 이분탐색
- 정보처리기사 실기 #정처기 실기 #2024년 2회 #정처기 2024년 2회 #공부법 # 꿀팁
- 2026 하반기 대기업 반드시 갑니다
- 넥슨개발자컨퍼런스
- level2
- 나는야 4학년 #5학년 까지 가보자구
- 서버 엔지니어
- 백엔드 개발자 로드맵
- AWS
- java #추상클래스
- software enginner
- level3
- heap area #stack area #static area #jvm
- ndc2025
- java #예외처리 #throw #throws
- server developer
- 반복문
- static #자바 메모리 구조 #멤버 변수
- object 클래스 # java
- 올 겨울은 조금 따뜻할 것 같다.
- Spring
- aws SAA-c03
- Next.js
- tibero 7.23
- 주니어 백엔드 개발자
- Today
- Total
개발자 쿠키
[슬라이딩윈도우] 프로그래머스 - 연속된 부분 수열의 합 (JAVA) 본문
1. 문제
연속된 부분 수열의 합 (프로그래머스 Lv.2)
비내림차순으로 정렬된 수열이 주어질 때, 다음 조건을 만족하는 부분 수열을 찾는 문제입니다.
조건을 만족하는 부분 수열의 시작 인덱스와 마지막 인덱스를 배열에 담아 반환하면 됩니다. 인덱스는 0부터 시작합니다.
https://school.programmers.co.kr/learn/courses/30/lessons/178870
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
제한사항
| 항목 | 범위 |
|---|---|
| sequence의 길이 | 5 이상 1,000,000 이하 |
| sequence의 원소 | 1 이상 1,000 이하 |
| 정렬 상태 | 비내림차순 정렬 |
| k | 5 이상 1,000,000,000 이하 |
| 정답 존재 여부 | k는 항상 부분 수열로 만들 수 있는 값 |
입출력 예
| sequence | k | result |
|---|---|---|
| [1, 2, 3, 4, 5] | 7 | [2, 3] |
| [1, 1, 1, 2, 3, 4, 5] | 5 | [6, 6] |
두 번째 예시는 합이 5인 연속 부분 수열이 [1, 1, 1, 2], [2, 3], [5] 세 개인데, 길이가 가장 짧은 [5]가 정답이 되어 [6, 6]을 반환합니다.
2. 틀린 이유
처음 접근: 백트래킹
합이 k가 되는 구간을 전부 찾아서 그중 최소 길이를 고르면 되겠다라고 생각했습니다. 시작 인덱스를 하나 잡고 뒤로 하나씩 더해 나가다가 합이 k를 넘으면 방식이었습니다. 그러나 시간 초과가 발생했습니다.
틀린 이유
문제를 다시 읽어 보니 sequence의 원소는 모두 1 이상의 자연수라는 제한이 있었습니다. 이 조건이 있으면 구간을 오른쪽으로 늘리면 합이 반드시 증가하고, 왼쪽을 줄이면 합이 반드시 감소합니다.
3. 알고리즘 풀이과정
슬라이딩 윈도우란
배열 위에 크기가 변하는 창문을 두고, 왼쪽 끝(left)과 오른쪽 끝(right) 두 포인터를 한 방향으로만 밀면서 조건을 만족하는 구간을 찾는 기법입니다. 매번 구간의 합을 새로 계산하지 않고, 창문이 이동할 때 들어온 값은 더하고 나간 값은 빼는 방식으로 갱신합니다.
동작 순서
4. 코드
class Solution {
public int[] solution(int[] sequence, int k) {
int[] answer = new int[2];
int left = 0;
int sum = 0;
int minLen = Integer.MAX_VALUE;
for(int right = 0; right < sequence.length; right++) {
sum += sequence[right];
while(sum > k) {
sum -= sequence[left];
left++;
}
if(sum == k) {
int len = right - left + 1;
if(len < minLen) {
minLen = len;
answer[0] = left;
answer[1] = right;
}
}
}
return answer;
}
}
'Problem Solving > java' 카테고리의 다른 글
| [다익스트라] 프로그래머스 - 경주로 건설 (JAVA) (0) | 2026.08.09 |
|---|---|
| [다익스트라] SWEA1249 [S/W 문제해결 응용] 4일차 - 보급로 (JAVA) (5) | 2026.07.30 |