[백준] 1541 잃어버린 괄호 Node.js (Greedy)

Janet·2023년 6월 26일
0

Algorithm

목록 보기
234/314

문제

세준이는 양수와 +, -, 그리고 괄호를 가지고 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다.

그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.

괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.

입력

첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다. 수는 0으로 시작할 수 있다. 입력으로 주어지는 식의 길이는 50보다 작거나 같다.

출력

첫째 줄에 정답을 출력한다.

예제 입력 1

55-50+40

예제 출력 1

-35

예제 입력 2

10+20+30+40

예제 출력 2

100

예제 입력 3

00009-00009

예제 출력 3

0

문제풀이

💡 문제풀이 과정

  • 덧셈을 해야하는 항들을 먼저 계산하여 합을 낸 다음, 뺄셈을 해야만 최소값이 나온다.
  • 예제) input: 1-2-3+4 output: -8
    • 먼저 ‘-’을 기준으로 value.split(’-’)하여 뺄셈인 항과 덧셈인 항을 분리한다. ⇒ [’1’, ‘2’, ‘3+4’]
    • 그리고 해당 배열에서 ‘+’로 다시 split()하고 덧셈을 해야하는 원소들만 합계를 낸다. ⇒ [1, 2, 7]
    • 답안 1번: 마지막으로 배열의 첫 번째 값에 2를 곱한 값에 배열의 합계를 빼준다. ⇒ (2 * 1) - (1 + 2 + 7) = -8
    • 답안 2번: answer 변수를 선언 후, 배열에서 반복문을 돌면서 인덱스 0이면 answer += n, 나머지는 answer -= n; 해주는 방법도 있다.

✅ 답안 #1

const filePath = process.platform == 'linux' ? '/dev/stdin' : './input.txt';
const input = require('fs').readFileSync(filePath).toString();
const nums = input.split('-').map((s) => s.split('+').reduce((a, b) => a + +b, 0));
console.log(2 * nums[0] - nums.reduce((a, b) => a + b));

✅ 답안 #2

const filePath = process.platform == 'linux' ? '/dev/stdin' : './input.txt';
const input = require('fs').readFileSync(filePath).toString();
const nums = input.split('-').map((s) => s.split('+').reduce((a, b) => a + +b, 0));
let answer = 0;
nums.forEach((n, i) => (i == 0 ? answer += n : answer -= n));
console.log(answer);
profile
😸

0개의 댓글