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

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
jiho_bae

Go devlog

DS & Algorithm/baekjoon

[백준] 14225번 부분수열의 합 - JavaScript(NodeJS)

2021. 6. 5. 20:14

문제

 

14225번: 부분수열의 합

수열 S가 주어졌을 때, 수열 S의 부분 수열의 합으로 나올 수 없는 가장 작은 자연수를 구하는 프로그램을 작성하시오. 예를 들어, S = [5, 1, 2]인 경우에 1, 2, 3(=1+2), 5, 6(=1+5), 7(=2+5), 8(=1+2+5)을 만들

www.acmicpc.net

 

풀이

1182번 문제 풀이 <- 다음의 문제와 거의 같은 유형이다.

 

다만 이 문제에서는, 부분 수열의 합으로 나올 수 없는 가장 작은 자연수를 구한다.

 

풀이 방법

1182번 문제와 동일하게, 모든 부분수열의 합을 구한다.

 

수열 S의 크기 N이 1<=N<=20이고, S를 이루는 수는 자연수이며 10만보다 작으므로,
가장 작은 자연수를 구하기 위해 200만 크기의 배열을 선언하고 모든 원소를 0으로 초기화한다.

 

부분수열의 합을 구할 때 마다, 합에 해당하는 배열의 인덱스에 1을 넣어준다.

 

부분수열의 합을 모두 구했다면,
배열의 인덱스=1부터 순차적으로 조회하면서
인덱스에 들어있는 원소가 0이라면 바로 조회를 끝내고 출력해준다.

 

코드

const sol = (input) => {
  const N = +input[0];
  const S = input[1].split(" ").map(Number);
  const MAX_SUM = 2000001; // 10만 * 20 => 부분수열 합의 최대가 200만을 넘을 수 없다.
  const sumArr = new Array(MAX_SUM).fill(0);
  const pick = [];

  function dfs(L) {
    if (L === N) {
      const sum = pick.reduce((sum, val) => sum + val, 0);
      sumArr[sum] = 1;
      return;
    }
    pick.push(S[L]);
    dfs(L + 1);
    pick.pop();
    dfs(L + 1);
  }
  dfs(0);

  for (let i = 1; i < MAX_SUM; i++) if (!sumArr[i]) return i;
};


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

[백준] 16197번 두 동전 - JavaScript(NodeJS)  (0) 2021.06.07
[백준] 15658번 연산자 끼워넣기(2) - JavaScript(NodeJS)  (0) 2021.06.07
[백준] 1182번 부분수열의 합 - JavaScript(NodeJS)  (0) 2021.06.05
[백준] 6603번 로또 - JavaScript(NodeJS)  (0) 2021.06.05
[백준] 14889 스타트와 링크 - JavaScript(NodeJS)  (0) 2021.06.04
    'DS & Algorithm/baekjoon' 카테고리의 다른 글
    • [백준] 16197번 두 동전 - JavaScript(NodeJS)
    • [백준] 15658번 연산자 끼워넣기(2) - JavaScript(NodeJS)
    • [백준] 1182번 부분수열의 합 - JavaScript(NodeJS)
    • [백준] 6603번 로또 - JavaScript(NodeJS)
    jiho_bae
    jiho_bae
    하루에 한 걸음씩

    티스토리툴바