[백준BOJ] 10823번 더하기 2 - JavaScript(node.js)

2023. 2. 10. 00:55개발/알고리즘 문제풀이

본 글은 백준 10823번 더하기 2 문제를 javascript를 이용하여 풀이한 내용이다.

문제

숫자와 콤마로만 이루어진 문자열 S가 주어진다. 이때, S에 포함되어 있는 자연수의 합을 구하는 프로그램을 작성하시오.

 

S의 첫 문자와 마지막 문자는 항상 숫자이고, 콤마는 연속해서 주어지지 않는다. 주어지는 수는 항상 자연수이다.

 

입력

문자열 S가 여러 줄에 걸쳐서 주어진다. S의 길이는 최대 10,000이다. 포함되어 있는 정수는 1,000,000보다 작거나 같은 자연수이다.

예제 입력

10,20,
3
0,50
,1
00

 

출력

문자열 S에 포함되어 있는 자연수의 합을 출력한다.

예제 출력

210

 

제한

  • 시간 제한 : 1초
  • 메모리 제한 : 256MB
1초에 최대 연산 횟수
O(N) 약 1억번
O(N^2) 약 1만번
O(N^3) 약 500번
O(2^N) 약 20번
O(N!) 10번

문제 풀이

대부분 알고리즘 문제를 풀 때, 주어진 입력을 어떻게 정리하여 원하는 인자들을 뽑아낼 수 있는지가 핵심이다.

여기서 "어떻게 정리"는 입력을 split()으로 어떻게 분리하는지가 이 문제에서는 가장 중요하다.

split()으로 나누는 방법은 javascript 문자열 여러 구분 기호로 분할에서 확인하면 자세하게 알 수 있다.

 

🔎 javascript 문자열 여러 구분 기호로 분할: Google 검색

 

www.google.com

 

간단하게 말하자면 1가지 기호로 분할할 경우, split("")에서 따옴표 내부에 해당 기호 또는 문자를 적으면 해당 기호 또는 문자로 문자열을 분해할 수 있다. 2가지 이상의 기호로 분할할 경우 split(//)에서 //사이에 따옴표 없이 ||(OR 연산자)로 구분하여 하나씩 작성하면 //내부의 인자들로 문자열을 분할할 수 있다.

 

입력을 어떻게 split 하느냐에 따라 푸는 방식이 여러 가지로 나뉠 수 있다.

","로 먼저 분할해 봤지만 분할한 입력이 다음과 같이 \n을 포함하고 있어 복잡하게 보였다. [ '10', '20', '\n3\n0', '50\n', '1\n00' ]

"\n"로 분할했더니 [ '10,20,', '3', '0,50', ',1', '00' ] 이와 같은 값이 나왔고 join("")을 이용하여 하나의 문자열로 합치면

10,20,30,50,100

 우리가 처음 입력으로 받고자 했던 형태의 문자열이 나왔다.

 

이를 split(",")을 통해 쉼표로 분할하고 map(Number)으로 숫자로 만들어준 뒤, reduce((pv, cv) => pv + cv, 0)) 를 통해 초기값이 0으로 지정된 pv에 배열의 각각의 인자를 cv를 통해 pv값에 더하여 결과값을 출력한다. 여기서 reduce가 익숙하지 않다면 for문을 통해 합을 구할 수 도 있다.


코드 1

reduce 사용

const input = require('fs').readFileSync(process.platform === "linux" ? "/dev/stdin" : "./input.txt").toString().trim().split(/\n/);
let str = input.join("");
console.log(str.split(",").map(Number).reduce((pv, cv) => pv + cv, 0));

코드 2

for문 사용

const input = require('fs').readFileSync(process.platform === "linux" ? "/dev/stdin" : "./input.txt").toString().trim().split(/\n/);
let str = input.join("");
let numGroup = str.split(",").map(Number);
let sum = 0;

for (let i = 0; i < numGroup.length; i++) {
    sum += numGroup[i];
}
console.log(sum);

마무리

백준 브론즈단계 문제는 내가 처음에 이 글을 읽고도 이해되도록 최대한 자세하게 풀이하려고 노력하는데 막상 설명이 장황해져서 이해하기 힘들지는 않을까 걱정된다. javascript(node.js)로 풀이된 문제들을 찾기 힘든 경우들이 많을 수 도 있는데 최대한 다른 언어의 문제들로도 같이 보면서 해석할 줄 아는 힘을 기르도록 노력하자.