본문 바로가기
알고리즘

[프로그래머스][JS] Lv.1 자릿수 더하기

by codnjs779 2022. 9. 15.

문제 설명

자연수 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

정리를 글뿐 아니라 시각자료를 사용해서 명시적으로 잘해두셨다! 참고자료로 아주 좋을 것 같다.

이 글 다시 한번 읽고 블로그에도 정리해두려고 한다.