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)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

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

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
jiho_bae

Go devlog

DS & Algorithm/baekjoon

[백준] 16198번 에너지 모으기 - JavaScript(NodeJS)

2021. 6. 8. 22:38

문제

 

16198번: 에너지 모으기

N개의 에너지 구슬이 일렬로 놓여져 있고, 에너지 구슬을 이용해서 에너지를 모으려고 한다. i번째 에너지 구슬의 무게는 Wi이고, 에너지를 모으는 방법은 다음과 같으며, 반복해서 사용할 수 있

www.acmicpc.net

 

풀이

N개의 에너지 구슬이 있다.

 

첫번째, 마지막을 제외한 X번째 구슬을 선택했을 때 다음을 따른다.

 

1 X번째 에너지 구슬을 제거한다.
2 X-1번째, X+1번째 에너지를 더해준다.
3 X번째 에너지 구슬이 제거되었으므로, 전체 N개의 구슬에서 1을 감소시키고 새로운 X번째 구슬을 선택한다.
4 에너지 구슬이 2개 남을 때 까지 반복했을 때 모은 에너지 양의 최댓값을 구하면 된다.

 

구슬의 개수가 3<=N<=10 이므로, N=10일 때 최대 8!의 경우의 수를 가진다.

 

1초 안에 모든 경우의 수를 조회할 수 있으므로, DFS를 이용해본다.

DFS의 로직은 다음과 같다.

 

0~N번 인덱스 중 1 ~ N-1번 인덱스를 제거하는 모든 경우의 수를 조회한다.
이전 재귀로부터 전달받은 배열(에너지 구슬의 배열) 크기가 2면 최댓값 여부를 판단하면 된다.

 

코드에서 ... 연산자를 사용했는데, 이는 Spread Operator 키워드로 검색하면 되겠다.

해당 연산자는 원 배열 energy에 변화를 주지 않고, 외부로부터 받은  배열의 X번째 에너지 구슬만을 제거하기 위해 사용했다.

 

코드

const sol = (input) => {
  const N = +input[0];
  const energy = input[1].split(" ").map(Number);
  let max = Number.MIN_SAFE_INTEGER;

  function dfs(arr, sum) {
    if (arr.length === 2) {
      max = Math.max(max, sum);
      return;
    }

    for (let i = 1; i < arr.length - 1; i++) {
      const restArr = [...arr.slice(0, i), ...arr.slice(i + 1, arr.length)]; 
      dfs(restArr, sum + arr[i - 1] * arr[i + 1]);
    }
  }
  dfs(energy, 0);
  return max;
};

// 백준에서 입력을 받는 코드
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' 카테고리의 다른 글

[백준] 1157번 단어 공부 - JavaScript(NodeJS)  (0) 2021.06.09
[백준] 9663번 N-Queen - JavaScript(NodeJS)  (1) 2021.06.08
[백준] 16197번 두 동전 - JavaScript(NodeJS)  (0) 2021.06.07
[백준] 15658번 연산자 끼워넣기(2) - JavaScript(NodeJS)  (0) 2021.06.07
[백준] 14225번 부분수열의 합 - JavaScript(NodeJS)  (0) 2021.06.05
    'DS & Algorithm/baekjoon' 카테고리의 다른 글
    • [백준] 1157번 단어 공부 - JavaScript(NodeJS)
    • [백준] 9663번 N-Queen - JavaScript(NodeJS)
    • [백준] 16197번 두 동전 - JavaScript(NodeJS)
    • [백준] 15658번 연산자 끼워넣기(2) - JavaScript(NodeJS)
    jiho_bae
    jiho_bae
    하루에 한 걸음씩

    티스토리툴바