백준 11720번을 풀어보았다.
let [N, input] = require('fs').readFileSync('/dev/stdin').toString().split('\n')
N = Number(N)
let sum = 0
for (let i = 0; i < N; i++) {
sum += Number(input[i])
}
console.log(sum)
JavaScript는 상당부분 문자열을 배열처럼 처리할 수 있다.*
배열의 특정 요소에 인덱스를 통해 접근하듯이, 문자열의 특정 문자에 인덱스를 통해 접근할 수 있고 이를 활용해 풀이하였다.
* 참고) 반복문 ① 배열
더보기
위 풀이와 관련하여 하나만 덧붙이자면, 문자 자료형인 input[i]를 숫자 자료형으로 변환하는 방법으로는 다음의 두 가지가 있다.
- Number(input[i])
- +input[i]
하지만 위 풀이와 달리, 아예 문자열을 배열로 변환하여 풀이할 수도 있다.
1. Array 객체의 from 메소드
let [N, input] = require('fs').readFileSync('/dev/stdin').toString().split('\n')
N = Number(N)
let sum = 0
const number = Array.from(input, (element) => Number(element))
for (let i = 0; i < N; i++) {
sum += number[i]
}
console.log(sum)
Array 객체의 from 메소드는 순회 가능 또는 유사 배열 객체에서 얕게 복사된 새로운 Array 인스턴스를 생성한다.
Array.from(arrayLike[, mapFn, thisArg])
- arrayLike: 배열로 변환할 순회 가능 또는 유사 배열 객체
- mapFn: 배열의 모든 요소에 대해 호출할 함수
- mapFn은 다음의 인수를 사용하여 호출된다.
- element: 현재 처리 중인 요소
- index: 현재 처리 중인 요소의 인덱스
- thisArg: mapFn 실행 시 this로 사용할 값
* 순회 가능 또는 유사 배열 객체로는 String, Set, Map, NodeList 등이 있다.
2. String 객체의 split 메소드
let [N, input] = require('fs').readFileSync('/dev/stdin').toString().split('\n')
N = Number(N)
let sum = 0
const number = input.split("").map(Number)
for (let i = 0; i < N; i++) {
sum += number[i]
}
console.log(sum)
split() 메소드의 인수로 공백("")을 전달하면 문자열의 각 문자를 요소로 가지는 배열을 생성할 수 있다.
3. Array 객체의 reduce 메소드
let [N, input] = require('fs').readFileSync('/dev/stdin').toString().split('\n')
N = Number(N)
let sum = 0
const number = input.split("").map(Number)
sum = number.reduce((accumulator, currentValue) => accumulator += Number(currentValue), 0)
console.log(sum)
앞선 풀이들은 문자열을 배열로 변환한 뒤 반복문을 사용해 sum을 구한 반면,
문자열을 배열로 변환한 뒤 Array 객체의 reduce 메소드를 사용하면 보다 간단하게 sum을 구할 수 있다.
참고) 백준 1546번
💫 이 문제를 통해 배운 것
문자열을 배열로 변환할 때 split 메소드만 사용해왔는데 from 메소드도 사용할 수 있다는 것을 새로 알게 되었다.