[문제풀이] 쿠키구입
업데이트:
문제 링크 : 쿠키구입
풀이 시간 : 30분
1. 문제 풀이
미리 배열의 누적 값을 구해서 탐색하는 문제
1) 각 위치 별 쿠키의 누적 개수를 저장
2) 각 위치를 돌면서 첫째가 갖을 수 있는 개수와 둘째가 갖을 수 있는 개수를 비교
3) 적절한 조건을 통해서 효율성 높임
3-1) 한명이 최대한 갖을 수 있는 쿠키 수(전체 쿠키 수의 절반)를 이용하여 넘어가는 경우 스킵
3-2) 첫째가 갖는 경우가 현재 최대 값보다 작으면 스킵(둘째의 쿠키 수 계산 X)
2. 소스 코드
public int solution(int[] cookie) {
int answer = 0;
int len = cookie.length;
int[] sum = new int[len];
sum[0] = cookie[0];
// 각 위치까지의 누적 쿠키 개수
for (int i = 1; i < len; i++) {
sum[i] = sum[i - 1] + cookie[i];
}
// 한명이 가질 수 있는 최대 쿠키 수
int mid = sum[len - 1] / 2;
for (int i = 0; i < sum.length; i++) {
for (int j = i; j >= 0; j--) {
//첫째 아들이 받는 쿠키
int pivot = sum[i] - sum[j] + cookie[j];
// 최대 값보다 작을 때
if(answer>= pivot) {
continue;
}
// 한명이 가질 수 있는 최대 개수를 넘긴 경우
if (mid < pivot) {
break;
}
// 두번째 아들이 받는 쿠키
for (int k = i + 1; k < len; k++) {
int temp = sum[k] - sum[i];
// 첫째보다 많거나 같을 경우
if (pivot <= temp) {
// 같으면 현재 최대값과 비교
if (pivot == temp) {
answer = Math.max(answer, pivot);
}
break;
}
}
}
}
return answer;
}
3. 후기
쿠키의 누적을 미리 계산을 하여 아들들이 갖는 쿠키의 수를 빠르게 계산한다
이를 이용한 정렬 방법인 Count sorting이 있는데 입력값이 특정 조건을 만족하면 정렬의 속도는 O(n)이 된다.