과자를 바구니 단위로 파는 가게가 있습니다. 이 가게는 1번부터 N번까지 차례로 번호가 붙은 바구니 N개가 일렬로 나열해 놨습니다.
철수는 두 아들에게 줄 과자를 사려합니다. 첫째 아들에게는 l번 바구니부터 m번 바구니까지, 둘째 아들에게는 m+1번 바구니부터 r번 바구니까지를 주려합니다. 단, 두 아들이 받을 과자 수는 같아야 합니다(1 <= l <= m, m+1 <= r <= N). 즉, A[i] 를 i번 바구니에 들어있는 과자 수라고 했을 때, A[l]+..+A[m] = A[m+1]+..+A[r] 를 만족해야 합니다.
각 바구니 안에 들은 과자 수가 차례로 들은 배열 cookie가 주어질 때, 조건에 맞게 과자를 살 경우 한 명의 아들에게 줄 수 있는 가장 많은 과자 수를 return 하는 solution 함수를 완성해주세요. (단, 조건에 맞게 과자를 구매할 수 없다면 0을 return 합니다)
cookie의 길이는 1 이상 2,000 이하입니다.
cookie의 각각의 원소는 1 이상 500 이하인 자연수입니다.
맨처음 봤을때는 문제를 제대로 읽지 않아 그냥 이분방식을 사용하면 바로 해결되는 문제라고 생각했는데 아니었다 처음부터가 아닌 i번 바구니부터라는 글을 제대로 읽지 않아서 많은 시간을 썼다.
실제로 이분방식으로도 해결이 가능하나 누적합과 이분방식보다는 투포인터 방식이 더 깔끔해 보여서 이 방식으로 해결했다.
원리는 다음과 같다.
I번째 바구니와 I+1번째 바구니를 각각 아들에게 나눠준다
I번째의 합이 크다면 다음 바구니를 둘째 아들에게 준다.
I+1번째 합이 크다면 이전 바구니를 첫째 아들에게 준다.
두 바구니의 값이 같다면 양쪽 바구니 모두 확장.
이에 대한 예외값만 처리한다면 문제가 해결이 된다.
코드
import java.util.*;
class Solution {
public int solution(int[] cookie) {
int answer = 0;
for(int i=0;i<cookie.length-1;i++){
int left = i;
int right = i+1;
int leftSum =cookie[i];
int rightSum =cookie[i+1];
if(leftSum==rightSum){
answer = Math.max(rightSum,answer);
}
while(true){
if(leftSum==rightSum){
answer = Math.max(rightSum,answer);
if(left==0||right==cookie.length-1){
break;
}
left--;
right++;
leftSum += cookie[left];
rightSum += cookie[right];
}else if(leftSum<rightSum){
if(left==0) break;
left--;
leftSum += cookie[left];
}else if(leftSum>rightSum){
if(right==cookie.length-1) break;
right++;
rightSum += cookie[right];
}
}
}
return answer;
}
}