본문 바로가기

Algorithm

[알고리즘] #22 자릿수 더하기 | 프로그래머스

728x90

프로그래머스 자릿수 더하기 알고리즘 문제이다.

 

https://programmers.co.kr/learn/courses/30/lessons/12931

 

코딩테스트 연습 - 자릿수 더하기

자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요. 예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다. 제한사항 N의 범위 : 100,000,000 이하의 자연수 입출

programmers.co.kr

 

 

 

 

 


 

 

 

 

문제 설명

 

자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.

 

 

제한사항
  • N의 범위 : 100,000,000 이하의 자연수

 


 

 

입출력 예
 

 
 

 

입출력 예 설명

 

입출력 예 #1
문제의 예시와 같습니다.

 

입출력 예 #2
9 + 8 + 7 = 24이므로 24를 return 하면 됩니다.

 

 

 


 

 

< 문제 풀이 >

 

자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.

 

function solution(n)
{
	// 숫자를 문자열로 만든다음 각각 나눠서 배열로 만들기
    let arr = (n + '').split('');
    
    // 배열에 문자열로 된 숫자들을 숫자로 바꿔주기
    let num = arr.map(arr => parseInt(arr));
    
    // reduce 메소드로 배열 안의 합을 구해주기
    let result = num.reduce((acc, cur, index) => acc += cur, 0);
    
    return result;
}

 


 

푸는 과정 생각해보기 

 

123을 [1,2,3]까지 만드는 과정이다. 그리고 [1,2,3]까지 오면 reduce 메소드로 안의 합을 구해줄 것이다. 다시 처음으로 돌아가본다. 먼저, 123을 '123'으로 만들어준다. ''빈 문자열을 더하면 알아서 문자열로 형변환된다. 그 다음 split을 사용해서 나눠주면 ['1', '2', '3'] 각각 나눠져 배열로 만들어진다. 그 다음으로는 [1, 2, 3]으로 만들어주기 위해서 map 메소드를 사용했다. map()은 주어진 조건에 맞춰서 새로운 배열로 만들어준다. 따라서 pasInt라는 조건에 맞춰서 배열안을 숫자로 바꿔준다. [1,2,3]이 되었다면 reduce()메소드로 각각을 더해주게 된다. reduce() 메소드는 누적값, 현재값, 인덱스를 활용해 안을 하나하나씩 훑어준다. 여기서 반복해서 훑는동안에 누적값에 현재값을 계속 더해주게 만들었으니 결국 전체를 더해주게 되는 것이다. 그래서 이렇게 여기까지 왔으면 6으로 잘 출력된다.

 

   let result = num.reduce((acc, cur, index) => acc += cur, 0);

 

여기서 이 부분 마지막에 초기값 0을 넣어주었다. 이것은 누적값을 0으로 시작한다는 말인데, 처음에는 까먹고 넣지 않았다. 다행히 오류는 나지 않고 문제가 통과되었지만 확실하게 하기 위해 제출 후에 0을 추가하였다. 보통 초기값을 써넣지 않으면 1부터 시작한다고 나와있는데 왜 오류가 나지 않은 것인지 모르겠지만 앞으로는 초기값을 잊지 않고 써야겠다.

 

 

 

 


 

 

 

다른 사람들은 어떻게 풀었을까?

 

https://programmers.co.kr/learn/courses/30/lessons/12931/solution_groups?language=javascript&type=all 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

이것은 숫자로 계산한 풀이 답안이다.

 

자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.
function solution(n){
    // 문자 풀이
    // return (n+"").split("").reduce((acc, curr) => acc + parseInt(curr), 0)

    // 숫자풀이
    var sum = 0;

    do {
    
    	// n을 10으로 나눈 값의 나머지를 계속 더해준다.
        sum += n%10;
        
        // 위에서 나눌 때 소수점이 생기므로 소수점은 무시해준다.
        n = Math.floor(n/10);
    } while(n > 0);

    return sum;
}

 

n = 123이다. 이 문제는 각각 자리수인 1 2 3을 더하는 문제이다. 즉 6을 구해야한다. 위의 풀이방식을 이해해보자. 여기서는 n % 10을 사용해서 먼저 각자리 1 2 3 을 따로 따로 꺼내도록 하였다. 처음 n % 10을 하면 12.3이므로 나머지가 3이다. 그리고 sum 변수에 넣어서 더해준다. 다음으로는 12.3이 된 상황을 고려해준다. 만약 12.3을 다시 10으로 나누게 되면 1.23으로 번거로워진다. 따라서 다음 식에서는 Math.floor(n/10)를 사용해서 10으로 나눴을 때 나머지는 고려하지 않게 해준다. 12.3이면 12로 바꿔준다. 그럼 다시 반복되어 위로 올라간 식을 실행할 때 12로 바꾼 상태에서 다시 10을 나누고 나머지가 2이다. 그럼 다시 sum에 2를 저장하게 되어 3+2를 만들어준다. 같은 식으로 계속 반복하면 6이라는 정답을 얻을 수 있다.

 

 

 

 

 

 

참고

math.floor https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Math/floor

 

728x90