jiho_bae
Go devlog
jiho_bae
전체 방문자
오늘
어제
  • 분류 전체보기 (158)
    • JavaScript (38)
      • theory (34)
      • vanilla (4)
    • HTML & CSS (2)
    • Browser (3)
    • CS (6)
      • linux (1)
      • shell (2)
      • compiler (2)
    • DS & Algorithm (87)
      • theory (5)
      • basic (7)
      • programmers (30)
      • baekjoon (45)
    • Design Pattern (2)
    • Error (4)
    • Git & Github (4)
    • Tools (1)
    • 부트캠프 (4)
    • Small Tips (2)
    • Java (3)
    • test (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 25632 소수 부르기 게임
  • 가사 검색 자바스크립트
  • 자바스크립트 sort는 왜 그모양일까
  • JavaScript
  • 백준 자바스크립트 입력 템플릿
  • 대충만든자판 javascript
  • 자바스크립트 채팅방 스크롤
  • 리코쳇 로봇 javascript
  • 1753 최단경로 javascript
  • 계수정렬 자바스크립트
  • 깃 이전 커밋에서 새 브랜치 만들기
  • 병합정렬 자바스크립트
  • 카카오 코딩테스트 양궁대회 nodeJS
  • fetch 취소하기
  • safari invalid date error
  • 13460 javascript nodejs
  • 덧칠하기 javascript
  • 백준 17406 nodeJS
  • 외벽 점검 javascript
  • 자바스크립트 배열의 특수함
  • 프로그래머스 숫자카드나누기 javascript
  • 퀵정렬 자바스크립트
  • safari Date format NaN
  • 억억단을 외우자 javascript
  • 자바스크립트 커링
  • 리액트 프로젝트 디버깅하기
  • 자바스크립트 모듈 시스템
  • javascript use strict
  • 자바스크립트 비동기 마이크로 태스크 큐와 렌더링 과정
  • 자바스크립트 이벤트 위임

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
jiho_bae

Go devlog

[백준] 14888번 연산자 끼워넣기 - JavaScript(NodeJS)
DS & Algorithm/baekjoon

[백준] 14888번 연산자 끼워넣기 - JavaScript(NodeJS)

2021. 6. 4. 19:02

문제

 

14888번: 연산자 끼워넣기

첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, 

www.acmicpc.net

 

풀이

문제가 길고 복잡해보이지만, 결론은 숫자 사이에 연산자를 끼워 넣은 모든 경우의 수를 조회하면 된다.
연산자의 연산은 앞에서부터 진행됨을 유의하면서 모든 연산을 진행하고, 최댓값과 최솟값을 구한다.

 

풀이 방향

 

연산자의 갯수가 주어지고, 이를 배열에 순차적으로 담는다.

0:+, 1:-, 2:*, 3:/ 에 대응하는 배열 인덱스를 활용해서 문제를 풀어본다.

 

수의 개수가 2<=N<=11 이므로 브루트 포스로 풀기에 충분하다.

 

연산자가 배치되는 모든 경우의 수를 조회할 것이며
연산자의 순서가 모두 배치된 시점에서 연산을 해서 최대 최솟값을 구해보자.

 

※ 주의사항

나눗셈을 할 때,

(음수 / 양수) 라면, (양수 / 양수) 로 바꿔주고, 몫을 취한 뒤 결과 값을 음수로 출력한다.

 

코드

const sol = (input) => {
  const N = +input[0];
  const numbers = input[1].split(" ").map(Number);
  const operator = input[2].split(" ").map(Number);
  const operObj = {
    0: (oper1, oper2) => oper1 + oper2,
    1: (oper1, oper2) => oper1 - oper2,
    2: (oper1, oper2) => oper1 * oper2,
    3: (oper1, oper2) => {
      if (oper1 < 0) {
        return -Math.floor(-oper1 / oper2);
      }
      return Math.floor(oper1 / oper2);
    }, // operObj 객체에 순차적으로 덧셈, 뺄셈, 곱셈, 나눗셈을 선언해둔다.
  };

  const temp = [];
  let min = Number.MAX_SAFE_INTEGER;
  let max = Number.MIN_SAFE_INTEGER;
  function dfs(L) {
    if (L === N - 1) { // 연산자는 숫자의 개수보다 1개 적으므로, 누적된 연산자가 N-1개라면 최대 최소값을 판단 할 것.
      let oper1 = numbers[0];
      for (let i = 0; i < temp.length; i++) {
        let oper2 = numbers[i + 1];
        let idx = temp[i];
        oper1 = operObj[idx](oper1, oper2); // operObj 객체를 이용해서 연산자에 따른 연산을 순차적으로 수행
      }
      if (oper1 > max) max = oper1;
      if (oper1 < min) min = oper1;
    }

    for (let i = 0; i < 4; i++) {
      if (!operator[i]) continue;
      operator[i] -= 1;
      temp.push(i);
      dfs(L + 1);
      operator[i] += 1;
      temp.pop();
    } // 모든 경우의 수를 따져야 하므로 재귀가 끝나면 연산자 배열과 임시 배열을 원래대로 되돌려야 한다.
  }
  dfs(0);

  return `${max}\n${min}`;
};

// 백준에서 입력을 받는 코드
const input = [];
require("readline")
  .createInterface(process.stdin, process.stdout)
  .on("line", (line) => {
    input.push(line);
  })
  .on("close", () => {
    console.log(sol(input));
    process.exit();
  });
저작자표시 (새창열림)

'DS & Algorithm > baekjoon' 카테고리의 다른 글

[백준] 6603번 로또 - JavaScript(NodeJS)  (0) 2021.06.05
[백준] 14889 스타트와 링크 - JavaScript(NodeJS)  (0) 2021.06.04
[백준] 1339번 단어 수학 - JavaScript(NodeJS)  (0) 2021.06.04
[백준] 2529번 부등호 - JavaScript(NodeJS)  (0) 2021.06.04
[백준] 1967 트리의 지름 - JavaScript(NodeJS)  (0) 2021.06.03
    'DS & Algorithm/baekjoon' 카테고리의 다른 글
    • [백준] 6603번 로또 - JavaScript(NodeJS)
    • [백준] 14889 스타트와 링크 - JavaScript(NodeJS)
    • [백준] 1339번 단어 수학 - JavaScript(NodeJS)
    • [백준] 2529번 부등호 - JavaScript(NodeJS)
    jiho_bae
    jiho_bae
    하루에 한 걸음씩

    티스토리툴바