문제 설명
자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
예를 들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.
- N의 범위 : 100,000,000 이하의 자연수
| 123 | 6 |
| 987 | 24 |
입출력 예 #1
문제의 예시와 같습니다.
입출력 예 #2
9 + 8 + 7 = 24이므로 24를 return 하면 됩니다.
A. 내가 생각한 풀이 과정
1. 숫자를 split함수를 사용해서 문자열 배열로 가공
2. 배열 값 순차적으로 더해주기
해당 방식은, split 함수 사용하고 배열 값을 보면, string으로 배열이 생성된 것을 확인할 수 있다.
그럼 또 번잡하게 문자 -> 숫자 변환해주는 Number() 또는 parseInt() 사용해줘야 한다. 좀 더 효율적이고 새로운 방법이 없을까 검색해보다가 do while 반복문을 사용해, 나누기 계산을 조건에 맞게 시행하여 배열을 만드는 코드 발견함!
사람들 참 똑똑하다,,,ㅎ
해결 과정
1. do while 문을 사용하여 숫자 배열 생성
2. 초기값 0에 배열 값을 더해주는 reduce 함수 사용
1) do에 시행 조건 적어주고, while 이하에는 언제까지 실행할 것인지 조건 적어줌.
// const n = 161
const solution = (n) => {
const numberArr = []
let init = 0
do {
numberArr.push(n % 10) //✨1
n = Math.floor(n / 10) //✨1-2
} while (n > 0)
✨1
n = 161
161 %10 하면, return 나머지 1 : 해당 값을 numberArr 배열에 넣어줌.
현재 numberArr = [1]
✨1-2
161 / 10 하면, return 16
n = 16으로 재할당 됨.
이어지는 반복문에서는 16으로 위와 같은 연산을 n이 0보다 클 때까지 반복한다.
아래는 반복되는 연산 과정임.
🔽
*
n = 16
16 % 10, 나머지 6 : 해당 값을 numberArr 배열에 넣어줌.
현재 numberArr = [1,6]
16 / 10, 하면, return 1
**
n = 1
1 % 10, 나머지 1 : 해당 값을 numberArr 배열에 넣어줌.
현재 numberArr = [1,6,1]
1 / 10 return 0 (while문 종료됨)
2. 숫자열로 완성된 배열 numberArr를 reduce() 사용해서 덧셈 연산
init = numberArr.reduce(
(a,b) => a + b, init
)
✨전체 코드
const solution = (n) => {
const numberArr = []
let init = 0
do {
numberArr.push(n % 10);
n = Math.floor(n / 10)
} while (n > 0) {
init = numberArr.reduce(
(a,b) => a + b, init
)
}
return init
}
풀이과정에서 느낀 점
: do ~ while 반복문은 평소에 if나 for 보다는 빈도 있게 사용하지 않았다. 어떤 점이 다른 반복문이나 조건문들보다 좋은지 궁금해서 검색하다가 잘 정리되어 있는 블로그 글을 발견했다. 해당 글 원문은 https://12bme.tistory.com/134
[자바스크립트] 성능을 높이는 코드 스타일
자바스크립트의 기본 요소인 반복문과 조건문, 문자열 연산과 함께 배열과 객체의 생성과 초기화, 문자열 연산, 정규 표현식, 변수 탐색 등을 어떻게 작성하느냐에 따라 자바스크립트의 실행 성
12bme.tistory.com
정리를 글뿐 아니라 시각자료를 사용해서 명시적으로 잘해두셨다! 참고자료로 아주 좋을 것 같다.
이 글 다시 한번 읽고 블로그에도 정리해두려고 한다.
'알고리즘' 카테고리의 다른 글
| [프로그래머스][JS] Lv.1 가운데 글자 가져오기 (0) | 2022.09.19 |
|---|---|
| [프로그래머스][JS] Lv.1 서울에서 김서방 찾기 (0) | 2022.09.15 |
| [프로그래머스][JS] Lv.1 제일 작은 수 제거하기 (1) | 2022.09.13 |
| [프로그래머스][JS] Lv.1 핸드폰 번호 가리기 (0) | 2022.09.04 |
| [프로그래머스][JS] Lv.1 x만큼 간격이 있는 n개의 숫자 (0) | 2021.10.26 |