문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음
왓슨은 셜록에게 정수형 배열을 준다. 그의 챌린지는 왼쪽의 모든 요소의 합이 오른쪽의 모든 요소의 합과 같은 배열의 요소를 찾는 것이다.
arr = [5, 6, 8, 11]
8은 합이 11인 두 개의 부분배열 사이에 있다.
arr = [1]
해답은 왼쪽과 오른쪽의 합이 0인 [1]이다.
당신은 정수의 배열이 주어지고 해당 기준을 만족하는 요소가 있는지 결정해야 한다. 만약 있다면 YES 반환한다. 없다면 NO를 반환한다.
balancedSums 함수를 완성해라.
balancedSums 함수는 아래와 같은 매개변수를 가지고 있다.
매번 합을 구해주면 time limit에 걸려서 다른 방법으로 풀어야 한다. 그래서 처음에 전체 합을 구하고 해당 인덱스의 값만 더하고 빼는 것으로 문제를 해결했다.
먼저 arr의 사이즈가 1이면 YES를 반환해준다. 사이즈가 1이면 왼쪽, 오른쪽의 합이 0이기 때문이다.
if(arr.size() == 1){
return "YES";
}
leftSum과 rightSum을 정수로 선언하고 0을 할당한다.
int leftSum = 0;
int rightSum = 0;
전체 합을 rightSum에 할당한다. 이때 반복문을 통해서 요소를 더하면서 전체합을 구했다.
for(int i = 0; i < arr.size(); i++){
rightSum += arr.get(i);
}
다시 반복문을 통해서 해당 인덱스의 값을 rightSum에 빼고, 해당 값이 leftSum과 같다면 YES를 반환한다. 같지 않다면 leftSum에 해당 인덱스의 값을 더한다.
for(int i = 0; i < arr.size(); i++){
rightSum -= arr.get(i);
if(leftSum == rightSum){
return "YES";
}
leftSum += arr.get(i);
}
반복문이 끝나고 같은 값을 못 찾았다면 합이 같은 부분 배열이 없으므로 NO를 반환한다.
return "NO";
public static String balancedSums(List<Integer> arr) {
if(arr.size() == 1){
return "YES";
}
int leftSum = 0;
int rightSum = 0;
for(int i = 0; i < arr.size(); i++){
rightSum += arr.get(i);
}
for(int i = 0; i < arr.size(); i++){
rightSum -= arr.get(i);
if(leftSum == rightSum){
return "YES";
}
leftSum += arr.get(i);
}
return "NO";
}