문제
https://school.programmers.co.kr/learn/courses/30/lessons/178870#
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제 개요
이번 문제는 비내림차순(오름차순)으로 정렬된 수열에서 특정 조건을 만족하는 부분 수열을 찾아내는 문제입니다. 수열과 목표 합 k가 주어졌을 때, 다음과 같은 조건을 만족하는 부분 수열의 시작과 끝 인덱스를 찾아야 합니다.
문제 접근 방법
문제를 해결하기 위해 투 포인터 알고리즘을 사용하였습니다. 이 방법은 효율적인 연속 부분 수열 탐색에 적합하며, 특정 조건을 만족하는 수열의 구간을 빠르게 탐색할 수 있습니다. 다음은 문제를 해결하기 위한 접근 방식입니다.
- 포인터 초기화:
- start와 end 두 포인터를 초기화합니다. start는 현재 탐색하는 부분 수열의 시작 인덱스를, end는 끝 인덱스를 나타냅니다.
- sum 변수는 현재 부분 수열의 합을 저장합니다.
- minSize는 최소 길이를 저장하며, 초기값으로 Integer.MAX_VALUE를 사용합니다.
- 부분 수열의 탐색:
- end 포인터를 증가시키며 수열의 끝까지 탐색합니다.
- sum에 sequence[end] 값을 더합니다.
- 합이 k 이상일 때 처리:
- 합이 k 이상이면 sum이 k인지 확인합니다.
- 합이 k와 같을 때, 현재 부분 수열의 길이가 minSize보다 작으면, answer 배열에 start와 end - 1 값을 저장하고 minSize를 갱신합니다.
- sum에서 sequence[start] 값을 빼고 start 포인터를 증가시켜 부분 수열을 줄입니다.
import java.util.*;
class Solution {
public int[] solution(int[] sequence, int k) {
int start = 0, end = 0, sum = 0;
int minSize = Integer.MAX_VALUE;
int[] answer = new int[2];
while (end < sequence.length) {
sum += sequence[end++];
while (sum >= k) {
if (sum == k && (end - start) < minSize) {
minSize = end - start;
answer[0] = start;
answer[1] = end - 1;
}
sum -= sequence[start++];
}
}
return answer;
}
}
'문제 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 혼자서 하는 틱택토 - Java (0) | 2024.11.19 |
---|---|
[프로그래머스] 시소 짝꿍 - Java (0) | 2024.11.18 |
[프로그래머스] N-Queen - Java (0) | 2024.11.16 |
[프로그래머스] 거리두기 확인하기 - Java (1) | 2024.11.15 |
[프로그래머스] [PCCE 기출문제] 10번 / 공원 - Java (1) | 2024.11.13 |