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)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

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

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
jiho_bae

Go devlog

DS & Algorithm/baekjoon

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

2021. 6. 7. 16:17

문제

 

15658번: 연산자 끼워넣기 (2)

첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1보다 크거나 같고, 4N보다 작거나 같은 4개의 정수가 주어지는데, 차례대

www.acmicpc.net

 

풀이

연산자 끼워넣기 << 이전 연산자 끼워넣기 포스팅
이전에 작성한 코드를 기반으로 풀이했다.

 

두 문제의 차이는

14888번 문제는 N-1개의 연산자가 주어지지만,
이 문제는 N-1개 이상의 연산자가 주어진다.

 

코드에 대한 기본적인 설명은 14888번 문제를 참고하면 될 듯 하다.

 

 

작성한 코드의 차이점을 보면

 

14888번

최대, 최솟값을 구하기 위해 dfs 함수 외부에 temp 배열을 선언했다.
그래서 모든 재귀에서 temp배열을 사용하기 위해 원소를 push, pop 해줬다.
그리고 재귀에서 피연산자 사이에 연산자가 모두 배치되었다면 최대, 최솟값을 위한 모든 계산이 이루어지도록 했다.

 

 

해당 문제

시간초과 이슈로 조금 변형을 줬다.

 

함수 외부에 temp 배열을 선언하지 않고, 함수의 인수인 temp를 통해 이전의 연산값을 받도록 했다.

함수 내에서 재귀적인 호출을 시행할 때, 현재 temp 변수에서 연산을 통해 newTemp를 매개변수로서 다음 재귀에 전달했다.
또한 연산자가 모두 배치되었다면, 이미 연산의 결과가 temp에 담겨있으므로 최소,최대만 판단하도록 했다.

 

코드

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);
    },
  };

  let min = Number.MAX_SAFE_INTEGER;
  let max = Number.MIN_SAFE_INTEGER;
  function dfs(L, temp) {
    if (L === N - 1) {
      min = Math.min(min, temp);
      max = Math.max(max, temp);
      return;
    }

    for (let i = 0; i < 4; i++) {
      if (!operator[i]) continue;
      operator[i] -= 1;
      const nextTemp = operObj[i](temp, numbers[L + 1]); // 재귀 호출 전에 미리 연산을 하고 결과를 다음 재귀로 전달한다.
      dfs(L + 1, nextTemp);
      operator[i] += 1;
    }
  }
  dfs(0, numbers[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' 카테고리의 다른 글

[백준] 16198번 에너지 모으기 - JavaScript(NodeJS)  (0) 2021.06.08
[백준] 16197번 두 동전 - JavaScript(NodeJS)  (0) 2021.06.07
[백준] 14225번 부분수열의 합 - JavaScript(NodeJS)  (0) 2021.06.05
[백준] 1182번 부분수열의 합 - JavaScript(NodeJS)  (0) 2021.06.05
[백준] 6603번 로또 - JavaScript(NodeJS)  (0) 2021.06.05
    'DS & Algorithm/baekjoon' 카테고리의 다른 글
    • [백준] 16198번 에너지 모으기 - JavaScript(NodeJS)
    • [백준] 16197번 두 동전 - JavaScript(NodeJS)
    • [백준] 14225번 부분수열의 합 - JavaScript(NodeJS)
    • [백준] 1182번 부분수열의 합 - JavaScript(NodeJS)
    jiho_bae
    jiho_bae
    하루에 한 걸음씩

    티스토리툴바