[codility] TapeEquilibrium
2019, Sep 30
문제 요약
포인터위치에따라 배열을 나누어 합들을 구한 후 최소값을 찾는 문제
input : A = {3,1,2,4,3}
p = 1 => 3 - (1+2+4+3)
p = 2 => (3+1) - (2+4+3)
p = 3 => (3+1+2) - (4+3)
p = 4 => (3+1+2+4) - 3
output : 1
나의코드 53%
function solution(A) {
let aNum = 0;
let resultArr = [];
let tmpArr = A;
for(i=0; i< (A.length-1) ; i++){
let pNum = 0;
aNum += A[i]
tmpArr[i] = 0
pNum = tmpArr.reduce((a, b) => a + b, 0); //여기가 문제였던듯
resultArr.push(Math.abs(aNum-pNum));
}
return Math.min.apply(null, resultArr);
}
- 방향은 비슷하였으나 오른쪽 배열을 구하는데 for문안에 reduce를 써서 복잡도가 늘어난 상황
100% code (https://gist.github.com/jeanlescure/797eef515cfa4a05830b)
function solution(A) {
var retval;
var sumRight = A.reduce(function(pv, cv, idx){ return (idx > 0)? pv + cv : 0; }, 0);
var sumLeft = 0;
var substractions = [];
var maxI = A.length - 1;
for(var i = 0; i < maxI; i++){
sumLeft += A[i];
substractions.push(Math.abs(sumLeft - sumRight));
if (i + 1 <= maxI) sumRight -= A[i + 1];
}
return substractions.reduce(function(pv,cv,idx){ return (idx > 0)? ((pv < cv)? pv : cv) : cv; }, 0);
}