[백준 silver2] 잃어버린 괄호(1541)

이민선(Jasmine)·2023년 3월 22일
1

다시 그리디로 돌아왔다. 인터넷에 백준 문제 추천이라는 키워드로 검색하여 하나둘씩 도전해보고 더욱 더 겸손해진 상태로 돌아왔다. ㅋㅋㅋㅋㅋㅋ
여태까지 그리디, 구현, DFS, BFS, DP까지 기본적인 문제들 위주로 깔짝깔짝 맛보기를 해봤다. 그런데 좀 더 난이도 있는 다양한 문제들과 정렬, 그래프 같이 살 떨리는 유형에 도전해보기 전에 유형 맛보기를 한바퀴 더 하는 게 좋을 것 같다. 아직 기초가 튼튼하지 않은 것 같다는 생각이 계속 든다. 기초부터 튼튼히! 좌절 ㄴㄴ 열심히 해보쟝!!

문제

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

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

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

입력

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

출력

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

예제 입력 1

55-50+40

예제 출력 1

-35

예제 입력 2

10+20+30+40

예제 출력 2

100

예제 입력 3

00009-00009

예제 출력 3

0

나의 코드

const input = require("fs")
  .readFileSync("example.txt")
  .toString()
  .trim()
  .split("-");

const arr = input.map((el) =>
  isNaN(+el) ? el.split("+").reduce((s, v) => s + +v, 0) : el
);
const res = arr.reduce((acc, cur) => acc - +cur);
console.log(res);

최종 값이 최소값이 되게 하려면 마이너스 기호 단위로 쪼개서 괄호로 묶어야 한다.

ex. "55-50+40-80+20"가 주어졌을 때
최소값 만들기 목표 : 55-(50+40)-(80+20)

그래서 가장 먼저 input을 받아올 때 split("-")로 쪼갰다.

["55", "50+40", "80+20"]

그러면 쪼갠 원소들 중에 숫자만 있는 것들과 숫자 사이사이에 "+" 기호가 붙어있는 원소들이 있다.
이들을 구분할 때는 isNaN을 이용하였다. (숫자 사이사이에 +라는 문자열이 있으면 true)
숫자 사이 사이에 +가 있는 원소들은 괄호로 묶여 있으므로, 이들 각각을 +로 split하여 reduce를 이용하여 더해주었다.
이렇게 하면 괄호 안의 값들은 합산 되어서 하나의 숫자가 되므로, 식을 통틀어서 첫번째 숫자를 제외하고 -기호가 붙은 숫자들만 남게 된다. (첫번째 숫자의 부호는 문제에서 제시된 대로 결정됨.)

["55", 90, 100]

이들을 reduce를 이용하여 하나씩 첫째값 (reduce에서 초기값)에서 빼주면 답이 된다.

55-90-100 = -135

저녁 먹고 다시 풀러오겠습니다~~ 아디오스~~

profile
기록에 진심인 개발자 🌿

2개의 댓글

comment-user-thumbnail
2023년 3월 23일

잘보고갑니다!

1개의 답글