[BOJ/JavaScript] 1541: 잃어버린 괄호

2025. 6. 21. 23:11·Problem Solving/BOJ

문제

이 식에 괄호를 적절하게 쳐서 식의 값을 최소로 만드려고 한다.

식은 0~9, +, -로만 이루어져 있다. 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다. 수는 0으로 시작할 수 있다.

 

풀이

그리디 알고리즘을 연습하고자 푼 문제다. 하지만 아이디어가 잘 떠오르지 않았다. 힌트를 얻어 풀 수 있었다. 아직 JS에 익숙하지 않아 파싱하는 데 어려움을 겪었다. 그리디 알고리즘은 아이디만 떠오르면 푸는 건 금방인데 아이디어가 잘 안떠오르면 시간이 많이 걸리는 듯하다..

💡 숫자로 판별될 수 있는 값과 그렇지 않은 값이 배열에 혼재되어 있으면 `map(Number)`를 사용할 수 없음에 주의하자.

 

최소값을 만드려면 뺄셈이 시작되면 무조건 많은 수를 빼야 한다. 이를 위해, `-`를 기준으로 문자열을 파싱한다. 파싱한 첫 식을 제외하고 나머지 식을 모두 빼주면 식의 값이 최소를 만족한다.

 

ex) `10+20+30-40+50-60+70`라는 식에서 `-`를 기준으로 파싱하면 `10+20+30`, `40+50+60+70`으로 나뉜다. 첫 번째 식을 제외하고 모든 식을 빼주면 최적의 값을 보장한다.

 

코드

처음 작성한 코드다. 코드가 다소 중복이 많은 점이 아쉽다.

const input = require("fs")
  .readFileSync(process.platform === "linux" ? "/dev/stdin" : "./input.txt", "utf8")
  .trim();

const numbers = input.replaceAll("-", " ").split(" ");

let sum = 0;
for (let i = 0; i < numbers.length; i++) {
  if (i === 0) {
    numbers[i] = numbers[i]
      .split("+")
      .map(Number)
      .reduce((acc, num) => (acc += num), 0);
    sum += numbers[i];
    continue;
  }
  numbers[i] = numbers[i]
    .split("+")
    .map(Number)
    .reduce((acc, num) => (acc += num), 0);
  sum -= Number(numbers[i]);
}

console.log(sum);

함수형 프로그래밍 방식으로 변환한 코드다.

const input = require("fs")
  .readFileSync(process.platform === "linux" ? "/dev/stdin" : "./input.txt", "utf8")
  .trim();

const blocks = input.split("-");

const sum = blocks
  .map(block =>
    block.split("+").map(Number).reduce((acc, val) => acc + val, 0)
  )
  .reduce((acc, val, idx) => (idx === 0 ? val : acc - val));

console.log(sum);
저작자표시 비영리 동일조건 (새창열림)

'Problem Solving > BOJ' 카테고리의 다른 글

[BOJ/JavaScript] 1987: 알파벳  (5) 2025.07.22
[BOJ/JavaScript] 9328: 열쇠  (1) 2025.06.30
[BOJ/JavaScript] 7453: 합이 0인 네 정수  (0) 2025.06.17
[BOJ/Java] 1863: 스카이라인 쉬운거  (0) 2025.06.17
[BOJ/Java] 16236: 아기 상어  (1) 2025.06.14
'Problem Solving/BOJ' 카테고리의 다른 글
  • [BOJ/JavaScript] 1987: 알파벳
  • [BOJ/JavaScript] 9328: 열쇠
  • [BOJ/JavaScript] 7453: 합이 0인 네 정수
  • [BOJ/Java] 1863: 스카이라인 쉬운거
friend5hip
friend5hip
개발 관련 지식이나 기록을 남기고 있습니다.
  • friend5hip
    friend5hip
    friend5hip
  • 전체
    오늘
    어제
    • 분류 전체보기 (60)
      • 컴퓨터공학 (2)
        • 자료구조 (0)
        • 알고리즘 (1)
        • 데이터베이스 (1)
      • Problem Solving (42)
        • BOJ (25)
        • 프로그래머스 (15)
      • 언어 (2)
        • JavaScript (2)
      • 라이브러리 (12)
        • React (12)
      • 개발 (2)
      • 기타 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    투 포인터
    집합
    삼성 sw 역량테스트
    누적 합
    vite
    문자열
    react
    dp
    dfs
    구간 합
    BFS
    코드트리
    프로그래머스
    java
    매개 변수 탐색
    intersection observer
    수학
    맵
    그리디
    백준
    완전 탐색
    JavaScript
    순열
    소수 판별
    정렬
    N과 M
    구현
    시뮬레이션
    이분 탐색
    백트래킹
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
friend5hip
[BOJ/JavaScript] 1541: 잃어버린 괄호
상단으로

티스토리툴바