초보 개발자의 이야기, 릿허브

[C++] 프로그래머스 자릿수 더하기 본문

코딩테스트/📘 프로그래머스 (programmers)

[C++] 프로그래머스 자릿수 더하기

릿99 2021. 8. 13. 17:30
728x90
반응형
1. 문제이해

코딩테스트 연습 - 자릿수 더하기 | 프로그래머스 (programmers.co.kr)

 

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

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

programmers.co.kr

 

주어진 자연수 N의 각 자릿수를 더해 리턴하는 알고리즘을 구현하는 것이 목표이다.

 

 

 

2. 문제풀이

 

N을 입력받아 각 자릿수의 합을 구하면 되는 문제이다.

예를 들어 534라는 수가 주어지면, 각 자릿수인 5, 3, 4를 더한 12를 리턴하면 된다.

여기서, 각 자리수를 어떻게 추출하여 더하는지가 문제인데,

처음 생각했던 방법은 입력받은 N을 문자열로 바꾸어 배열에 저장하고, 각 배열의 요소들을 더해주는 방법이었다.

하지만 이 방법은 시간이 오래걸리는 비효율적인 방법이라고 생각되어, 다른 방법을 생각해보았다.

 

최종적으로 코드에 적용한 방식은 나누기(/)와 나머지 연산자(%)를 사용한 방식이다.

예를 들어 287이라는 수가 주어졌을 때, 287 % 10 = 7로, 일의 자리의 숫자를 추출할 수 있다.

또한, 287 / 10 = 28로, 일의 자리 숫자를 제외한 나머지 자리 숫자를 구할 수 있게 된다. (십의자리가 일의자리, 백의자리가 십의자리가 된다.)

이러한 방식을 이용해, 나머지 연산자를 통해 주어진 수의 일의자리 숫자를 구한 다음,

나누기로 일의자리 숫자를 제외해주고,

이 숫자를 다시 나머지 연산자를 이용해 일의자리(원래는 십의자리)를 구하면 된다.

예시를 통해 다시 한번 보자.

 

1. 287 % 10 = 7로, 일의 자리 숫자 = 7

287 / 10 = 28

2. 28 % 10 = 8로, 십의 자리 숫자  = 8

28 / 10 = 2

3. 2 % 10 = 2로, 백의 자리 숫자 = 2

2 / 10 = 0

 

위와 같은 방식으로 각 자릿수를 구해 더해주어 리턴하는 방식을 선택했다.

문제의 주어진 틀은 다음과 같았다.

 

 

 

3. 소스코드
#include <iostream>
using namespace std;

int solution(int n)
{
    int answer = 0;
    
    while(n > 0){
        answer += n % 10;
        n = n / 10;
    }
    
    return answer;
}

주어진 틀에 위와 같이 소스코드를 구현했다.

n이 0보다 클 때만, 즉, 모든 자릿수를 다 구해 더할때까지 while 문을 실행하고,

n % 10으로 해당 수의 자릿수를 추출,

n/10으로 추출한 자릿수를 제외한 나머지 숫자를 다시 반환, 반복하는 형식으로 코드를 구현했다.

 

 


처음에 앞서 얘기한 방식인 문자열 변환 & 배열에 넣고 더하는 방식을 사용하려고 했다가

1단계인데 과연 이 방식으로 푸는게 맞는걸까.. 하고 급하게 방식을 전환했다..ㅎㅎ

위 방법으로 풀었다가는 시간이 배로 들었을것같다..

역시 코딩은 어떤 방식으로 구현하느냐가 제일 중요한것같다🙄

 

728x90
반응형