1. 문제 풀이 아이디어
- 두 포인터를 활용하여 문제를 해결할 수 있다.
2. 나의 정답 코드
class Solution {
public int solution(int[] queue1, int[] queue2) {
int answer = 0;
int[] sum = new int[queue1.length + queue2.length];
long sum1 = 0;
long sum2 = 0;
for (int i = 0; i < queue1.length; i++) {
sum[i] = queue1[i];
sum1 += queue1[i];
}
for (int i = 0; i < queue2.length; i++) {
sum[queue1.length + i] = queue2[i];
sum2 += queue2[i];
}
if ((sum1 + sum2) % 2 == 1)
return -1;
long avg = (sum1 + sum2) / 2;
int l = 0, r = queue1.length;
while (l < r && sum1 != avg && r < sum.length) {
if (sum1 > avg) {
sum1 -= sum[l];
l++;
} else {
sum1 += sum[r];
r++;
}
answer++;
}
return sum1 != avg ? -1 : answer;
}
}
3. 정리
- 두 배열을 하나로 합친 배열을 만들어 초기화하면서 각 배열의 합도 계산한다.
- 두 배열의 합이 홀수라면, 두 배열의 합을 같게 만드는 것은 불가능하므로 -1을 반환한다.
- 두 배열 합의 평균값을 구하고, 포인터
l
과r
을 각각 첫 번째 배열의 시작과 두 번째 배열의 시작 위치로 설정한 뒤 반복문을l
이r
보다 작고, 합이 평균값과 다르며,r
이 배열 길이를 넘지 않을 때까지 실행한다. - 첫 번째 배열의 합이 평균보다 크면,
l
을 증가시키고 해당 위치의 값을 합에서 뺀다. - 반대로 작다면,
r
을 증가시키고 해당 위치의 값을 합에 더한다. - 이후, 결과값
answer
를 증가시킨다.
- 반복문 종료 후, 합과 평균이 다르면 -1을 반환하고, 같으면 결과값을 반환한다.
Share article