[level 4] 쿠키 구입 - 49995
문제 설명
과자를 바구니 단위로 파는 가게가 있습니다. 이 가게는 1번부터 번까지 차례로 번호가 붙은 바구니 개가 일렬로 나열되어 있습니다.
철수는 두 아들에게 줄 과자를 사려 합니다. 첫째 아들에게는 번 바구니부터 번 바구니까지, 둘째 아들에게는 번 바구니부터 번 바구니까지를 주려 합니다. 단, 두 아들이 받을 과자 수는 같아야 합니다 (). 즉, $A[i]$를 번 바구니에 들어있는 과자 수라고 했을 때, $A[l] + \dots + A[m] = A[m+1] + \dots + A[r]$를 만족해야 합니다.
각 바구니 안에 들은 과자 수가 차례로 들은 배열 cookie가 주어질 때, 조건에 맞게 과자를 살 경우 한 명의 아들에게 줄 수 있는 가장 많은 과자 수를 return 하는 solution 함수를 완성해주세요. (단, 조건에 맞게 과자를 구매할 수 없다면 0을 return 합니다)
제한사항
- cookie의 길이는 1 이상 2,000 이하입니다.
- cookie의 각각의 원소는 1 이상 500 이하인 자연수입니다.
입출력 예
| cookie | result |
|---|---|
| [1, 1, 2, 3] | 3 |
| [1, 2, 4, 5] | 0 |
입출력 예 설명
예시 1: 첫째 아들에게 2, 3번 바구니를, 둘째 아들에게 4번 바구니를 사주면 두 아들은 각각 과자 3개를 받습니다.
예시 2: 주어진 조건에 맞게 과자를 살 방법이 없습니다.
구현 코드
public class Solution {
public int solution(int[] cookie) {
int answer = 0;
for (int i = 0; i < cookie.length - 1; i++) {
int left = i;
int leftSum = cookie[i];
int right = i + 1;
int rightSum = cookie[i + 1];
while (true) {
if (leftSum == rightSum && answer < leftSum) { // 두 형제의 쿠키의 합이 같으며, 쿠키의 합이 기존 answer에 저장했던 값보다 큰 경우
answer = leftSum; // answer에 새로 저장
} else if (leftSum <= rightSum && left != 0) { // 오른쪽이 더 많은 경우, 왼쪽을 늘려야함
leftSum += cookie[--left];
} else if (leftSum > rightSum && right != cookie.length - 1) { // 왼쪽이 더 많은 경우, 오른쪽을 늘려야함
rightSum += cookie[++right];
} else { // 더 이상 조절할 수 없을 때
break;
}
}
}
return answer;
}
}
성능 요약
메모리: 52.2 MB, 시간: 21.92 ms
채점결과
정확성: 66.7
효율성: 33.3
합계: 100.0 / 100.0