문제 설명
자연수 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
'Code KATA > 알고리즘 코드카타' 카테고리의 다른 글
[2024.12.16] 나머지가 1이 되는 수 찾기 (1) | 2024.12.16 |
---|---|
[2024.12.15] 약수의 합 (0) | 2024.12.16 |
[2024.12.13] 평균 구하기 (0) | 2024.12.13 |
[2024.12.12] 짝수와 홀수 (0) | 2024.12.12 |
[2024.12.11] 배열의 평균값 (0) | 2024.12.11 |