이번 글에서는 LeetCode 문제 2918. Minimum Equal Sum of Two Arrays After Replacing Zeros를 풀이하고, if / else if
구조와 독립된 if
구조에 대한 성능 실험을 함께 진행해봤습니다.
1. 문제 설명
You are given two arrays nums1 and nums2 consisting of positive integers.
You have to replace all the 0's in both arrays with strictly positive integers
such that the sum of elements of both arrays becomes equal.
Return the minimum equal sum you can obtain, or -1 if it is impossible.
Example 1:
Input: nums1 = [3,2,0,1,0], nums2 = [6,5,0]
Output: 12
Example 2:
Input: nums1 = [2,0,2,0], nums2 = [1,4]
Output: -1
2. 풀이 아이디어
- 각 배열의 합을 구할 때, 0은 최소값 1로 가정하여 더한다.
- 두 배열의 최소 가능한 합(sum1, sum2)을 비교한다.
- 합이 작은 쪽에 0이 하나라도 있다면, 큰 쪽과 같아지도록 조절 가능하므로 큰 값을 반환한다.
- 그렇지 않으면 -1을 반환한다.
3. 초기 풀이
아래는 처음 작성한 코드입니다. 약 85ms 정도가 소요되었습니다.
var minSum = function(nums1, nums2) {
let nums1Sum = 0;
let nums2Sum = 0;
let nums1ZeroCount = 0;
let nums2ZeroCount = 0;
for (let num of nums1) {
if (num === 0) {
nums1ZeroCount++;
nums1Sum += 1;
} else {
nums1Sum += num;
}
}
for (let num of nums2) {
if (num === 0) {
nums2ZeroCount++;
nums2Sum += 1;
} else {
nums2Sum += num;
}
}
if (nums1Sum > nums2Sum) {
if (nums2ZeroCount) return nums1Sum;
} else if (nums1Sum < nums2Sum) {
if (nums1ZeroCount) return nums2Sum;
} else {
return nums1Sum;
}
return -1;
};
4. 리팩토링된 풀이
변수명을 간결하게 정리하고 조건문 구조를 단순화했습니다. 약 78ms 정도로 소폭 개선되었습니다.
var minSum = function(nums1, nums2) {
let sum1 = 0, sum2 = 0;
let zero1 = 0, zero2 = 0;
for (let num of nums1) {
if (num === 0) {
zero1++;
sum1 += 1;
} else {
sum1 += num;
}
}
for (let num of nums2) {
if (num === 0) {
zero2++;
sum2 += 1;
} else {
sum2 += num;
}
}
if (sum1 === sum2) return sum1;
if (sum1 > sum2 && zero2 > 0) return sum1;
if (sum2 > sum1 && zero1 > 0) return sum2;
return -1;
};
5. 조건문 구조 실험: if vs else if
초기에는 조건문 구조 차이가 실행 시간에 영향을 준다고 생각했습니다. if → else if
구조는 조건을 만족하는 순간 이후 조건을 건너뛰기 때문에, 독립된 if
보다 더 빠를 것으로 예상했습니다.
하지만 실제로 아래와 같은 벤치마크 실험을 해보니, 상황에 따라 약간의 차이는 있으나 두 구조 간의 성능 차이는 매우 미미하다는 결론에 도달했습니다.
5-1. 실험 코드
const biasedData = Array.from({ length: 1e7 }, () => Math.floor(Math.random() * 6));
console.time("if-else chain");
let count1 = 0;
for (let i = 0; i < biasedData.length; i++) {
const x = biasedData[i];
if (x > 90) count1++;
else if (x > 80) count1++;
else if (x > 70) count1++;
else if (x > 60) count1++;
else if (x > 50) count1++;
else if (x > 40) count1++;
else if (x > 30) count1++;
else if (x > 20) count1++;
else if (x > 10) count1++;
else count1++;
}
console.timeEnd("if-else chain");
console.time("independent if");
let count2 = 0;
for (let i = 0; i < biasedData.length; i++) {
const x = biasedData[i];
let matched = false;
if (!matched && x > 90) { count2++; matched = true; }
if (!matched && x > 80) { count2++; matched = true; }
if (!matched && x > 70) { count2++; matched = true; }
if (!matched && x > 60) { count2++; matched = true; }
if (!matched && x > 50) { count2++; matched = true; }
if (!matched && x > 40) { count2++; matched = true; }
if (!matched && x > 30) { count2++; matched = true; }
if (!matched && x > 20) { count2++; matched = true; }
if (!matched && x > 10) { count2++; matched = true; }
if (!matched) count2++;
}
console.timeEnd("independent if");
console.log("Result:", count1, count2);
5-2. 실험 결과 (브라우저 콘솔 기준)
if-else chain: 30.18 ms
independent if: 31.73 ms
Result: 10000000 10000000
실험 데이터를 조건문 마지막에 걸리는 값(0~5 범위)으로 조정했음에도, 두 방식 모두 비슷한 성능을 보였습니다.
6. 결론: 조건문 구조는 코드의 '의도'에 따라 결정해야 한다
- 두 구조는 상황에 따라 소폭 차이가 있으나, 대부분의 경우 실질적인 성능 차이는 없다.
- 조건이 배타적이라면
if → else if → else
구조가 가독성과 표현력 측면에서 유리하다. - 조건이 중복되거나 모두 평가해야 하는 상황에서는
독립된 if
구조가 필요하다.
즉, 조건문 구조는 성능보다도 해당 로직이 어떤 의미를 담고 있는지를 명확히 표현하는 것이 가장 중요합니다.
결론: 조건문 구조는 빠른 코드보다 명확한 코드가 더 중요하다.
'Web Development > algorithm' 카테고리의 다른 글
[Algorithm][LeetCode 75][Medium] Sort Colors (0) | 2025.05.17 |
---|---|
[Algorithm][LeetCode 1550] Three Consecutive Odds (1) | 2025.05.11 |
[Algorithm][LeetCode 69] Sqrt(x) (1) | 2025.05.08 |
[Algorithm][LeetCode 35] Search Insert Position (0) | 2025.05.07 |
[Algorithm][LeetCode 1920] buildArray (0) | 2025.05.06 |