최솟값을 가지도록 괄호가 쳐져있다고 생각해야한다.
-
가 붙은 숫자를 시작으로 뒤에가 가장 값이 클때 괄호를 닫아줘야한다.
+와 -연산만 존재함으로 가장 값이 클 때는 + 연산이 이어져서 나오는 부분이다.
(다음 - 를 만나기 전까지! )
10+20-30+40-50
이라고 가정하면 10+20-(30+40)-50
이 가장 작은 값이다.
- -를 기준으로 나누면 아래와 같다.
[ '10+20' , '30+40' , '50' ]
- 배열을 순회하면서 +연산이 필요한 부분은 모두 더해준다.
[30, 70, 50]
- 기준으로 분리했으니, 첫번째 배열부터 시작하여 값을 빼준다.
정답 : -150
const fs = require("fs");
//1. - 기준으로 배열로 분리
let input = fs.readFileSync("/dev/stdin").toString().split("-");
//1번 input = [ '10+20' , '30+40' , '50' ]
//3번 answer = -130
// reduce에서 값을 -해서 누적하여 값 반환
let answer = input.reduce((total, item, idx) => {
//split : 각각 배열은 문자열로 되어있으며, + 연산자가 있는 것도 있다.
//map : + 기준으로 나눠 배열로 만들고 숫자로 만든다.
//reduce : 값을 누적하여 합해준다 > 합한 값이 나오도록 한다.
//2번 sum= [30, 70, 50]
let sum = item
.split("+")
.map((a) => +a)
.reduce((total, cur) => total + cur);
return idx === 0 ? total + sum : total - sum;
}, 0);
console.log(answer);
리턴할 때 처음에 total-sum 으로 해줬는데 그럴경우,
-30-70-50이 되어버린다.
첫번째의 경우는 양수 값이기 때문에 30-70-50이 되어야하기 때문에,
첫번째 인자일 경우는 값을 더할 수 있도록 해야한다.