잃어버린 괄호

문제

언어

  • JavaScript

문제 풀이 step 1

  • 우선 주어진 수식을 숫자와 부호로 구분해서 분리합니다.
  • 그리고 스택을 이용해서 + 만 먼저 계산합니다. 이때 “- 50 + 30” 이 “- 80” 이 되므로 식의 값을 최소로 만들 수 있습니다.
  • 위의 과정을 수행하면 식에는 - 부호만 남아있습니다. 그리고 문제에서 가장 처음과 마지막 문자는 숫자라고 했으므로 맨 앞의 수는 양수입니다.
  • 따라서 맨 앞의 수를 제외한 나머지 수는 다 음수입니다.
  • 맨 앞의 수를 제외한 나머지 수들을 더하고 맨 앞의 수에서 빼주면 정답을 구할 수 있습니다.

소스 코드

const input = require("fs").readFileSync("/dev/stdin").toString().split("\n");

// 숫자와 부호를 나누는 함수
const splitter = (str) => {
	const arr = [];

	let cur = 0;
	for (let i = 0; i < str.length; i++) {
		if (str[i] === "+") {
			arr.push(parseInt(str.substring(cur, i)));
			arr.push(str[i]);
			cur = i + 1;
		} else if (str[i] === "-") {
			arr.push(parseInt(str.substring(cur, i)));
			arr.push(str[i]);
			cur = i + 1;
		}
	}
	arr.push(parseInt(str.substring(cur)));

	return arr;
};

const solution = (input) => {
	let arr = splitter(input[0]);

	let stack = [];
	// 스택을 이용해서 우선 + 먼저 계산을 진행
	for (let i = 0; i < arr.length; i++) {
		if (arr[i] === "+") {
			let a = stack.pop();
			let b = arr[++i];
			stack.push(a + b);
		} else {
			stack.push(arr[i]);
		}
	}

	// 주어진 문자열이 + 부호로만 이루어진 경우 (예외 처리)
	if (stack.length === 1) return stack[0];

	// 첫 번째 수는 무조건 양수이다.
	let firstNum = stack[0];

	// 남은 문자열에는 - 부호만 남아있으므로 첫 번째 수를 제외한 나머지 수를 다 더하고 첫 번째 수에서 빼주면 된다.
	res = stack.filter((v) => v !== "-").reduce((ac, v) => ac + v);
	return firstNum * 2 - res;
};

console.log(solution(input));