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

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
jiho_bae

Go devlog

DS & Algorithm/baekjoon

[백준] 2231번 분해합 - JavaScript(NodeJS)

2021. 7. 16. 11:49

문제

 

2231번: 분해합

어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이

www.acmicpc.net

 

코드

function sol(input) {
  let answer = 0;

  const len = input.length;
  const N = +input;
  const min = input - len * 9;
  for (let i = min; i <= N; i++) {
    const str = String(i);
    const num =
      +str +str.split("")
            .map(Number)
            .reduce((s, v) => s + v, 0);
    if (num === N) {
      answer = +str;
      break;
    }
  }
  return answer;
}

require("readline")
  .createInterface(process.stdin, process.stdout)
  .on("line", (line) => {
    console.log(sol(line));
  })
  .on("close", () => {
    process.exit();
  });

 

풀이

자연수 N의 분해합은 N + N의 각 자리수를 더한 수를 의미한다.
예를 들면 자연수 123의 분해합은 123+1+2+3=129이다.

 

여기서 129는 123의 분해합이며, 123을 129의 생성자라고 한다.

 

자연수 N의 가장 작은 생성자를 구해보자.

 

 

생성자가 가장 작을 경우를 생각해봐야 하는데,

각 자릿수는 0~9까지 숫자를 가질 수 있다.

 

그러므로 생성자가 가장 작은 경우부터 주어진 자연수 N까지 조회해서

처음으로 발견된 생성자가 정답이고 발견되지 않았다면 0이 정답이다.

 

(엄연히 따지면 맨 앞 자리 숫자는 따로 처리해주는게 맞지만, 큰 차이는 아니니 무시할 수 있다.)

 

예를 들면, N이 세 자릿수 숫자라면 (N - 9*3 ~ N)까지 조회한다.

 

주석을 포함한 코드

function sol(input) {
  let answer = 0;
  const len = input.length; // N의 자릿수
  const N = +input; // 문자를 숫자화한 N
  const min = input - len * 9; // N - 9 * 자릿수 부터 시작한다.
  for (let i = min; i <= N; i++) { // for문에서는 숫자화한 min를 이용한다.
    const str = String(i); // 연산에서는 문자열화한 str을 이용한다.
    const num =
      Number(str) + str.split("")
            .map(Number)
            .reduce((s, v) => s + v, 0);
    // 숫자를 문자열화 한 str의 각 자릿수를 분리해서, map함수로 숫자화, reduce 함수로 모든 자릿수를 더한다.
    // 최종적으로 num 변수에는 숫자 i의 분해합이 주어진다.

    // 숫자만을 이용한다면 i를 10으로 나눈 나머지와 몫을 갱신해가며 더해줄 수도 있다.
    if (num === N) {
      answer = i;
      break;
    } // 가장 먼저 발견된 생성자 i는 가장 작은 생성자이다.
  }
  return answer;
}

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

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

[백준] 1541번 잃어버린 괄호 - JavaScript(NodeJS)  (0) 2021.07.19
[백준] 2108번 통계학 - JavaScript(NodeJS)  (0) 2021.07.18
[백준] 3055번 탈출 - JavaScript(NodeJS)  (0) 2021.07.07
[백준] 1316번 그룹 단어 체커 - JavaScript(NodeJS)  (0) 2021.07.02
[백준] 1037번 약수 - JavaScript(NodeJS)  (0) 2021.07.01
    'DS & Algorithm/baekjoon' 카테고리의 다른 글
    • [백준] 1541번 잃어버린 괄호 - JavaScript(NodeJS)
    • [백준] 2108번 통계학 - JavaScript(NodeJS)
    • [백준] 3055번 탈출 - JavaScript(NodeJS)
    • [백준] 1316번 그룹 단어 체커 - JavaScript(NodeJS)
    jiho_bae
    jiho_bae
    하루에 한 걸음씩

    티스토리툴바