Code KATA/알고리즘 코드카타

[2024.12.14] 자릿수 더하기

iiblueblue 2024. 12. 16. 16:53

문제 설명

자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.

예를 들면 N=123이면 1+2+3=6을 return 하면 됩니다 

 

 

제한사항

  • N의 범위 : 100,000,000 이하의 자연수

 

 

입출력 예

N return 설명
123 6 문제의 예시와 같습니다.
987 24 9 + 8 + 7 = 24이므로 return하면 됩니다.

 

 

문제 풀이

풀이 언어 : C++

#include <iostream>
#include <cmath>

using namespace std;
int solution(int n)
{
    int answer = 0;
    int addNum;
    int myN=n;
    
    for(int i=8; i>-1; i--)
    {
        addNum=myN/(int)pow(10.0, i); // 자릿수 구하기 123->1
        myN-=addNum*(int)pow(10.0, i); // myN 업데이트 123->23
        answer+=addNum; // 결과값에 더하기
    }

    return answer;
}

나누기를 사용해야 한다는 것을 알면서도 오랜만에 하니 꽤 오래 생각했던 문제였다. 123을 예로 들어보자.

123 / 100 = 1

23 / 10 = 2

3 / 1 = 3

이처럼 높은 자릿수부터 각 자릿수 만큼 나누어주면 해당 자릿수의 숫자를 얻을 수 있는 것을 확인할 수 있다. 123의 가장 큰 자릿수인 100의 자리 1부터 분리해오기 위해서는 100을 나누어 주면 된다.

문제는 그 다음 자릿수를 구하는 것인데 다음 자릿수를 구하기 위해서는 가장 큰 자릿수인 1이 사라진 상태여야만 한다. 따라서 기존 123에서 100의 자릿수인 1을 없애기 위해 123-100을 하면 된다.

 

정리하면 다음과 같은 과정이 필요하다.

1. 가장 큰 자릿수의 수를 구한다.

2. 구한 자릿수를 기존 수에서 제외한다.

3. 구한 자릿수를 결과(answer)에 더한다.

문제의 조건에 N의 범위를 100,000,000(10의 8제곱)이라고 지정해주었기 때문에 for문은 8부터 시작하여 감소하는 것으로 한다. addNum에 myN/(int)pow(10.0, i)를 하여 가장 큰 자릿수의 수를 구한다. myN에서 구한 자릿수를 제외시키기 위해 addNum*(int)pow(10.0, i)를 뺀다. 마지막으로 처음에 구했던 addNum을 answer에 더한다.

 

참고사항

double pow(double a, double b) 함수는 a의 b제곱의 수를 구해주는 함수이다. 사용하기 전 #include<cmath>가 선언되어 있어야 한다.

#include <cmath>

...

testNum=pow(10.0, 2); // 100

반환값, 매개변수 모드 double형이다.

 

오답노트

가장 큰 자릿수를 구한 후 구한 자릿수는 기존 수에서 제외해야하는데 이 부분을 빼먹었다.

n을 그대로 사용하였는데 n에는 직접적인 수정이 일어나지 않아 빼기를 해도 값이 변하지 않아 너무 큰 수가 답으로 나왔다.

 

 

문제 링크

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr