본문 바로가기
C#/프로그래머스

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

by TODAYCODE 2021. 7. 30.
반응형

프로그래머스 코딩테스트 연습 Level 1 - 자릿수 더하기

 

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

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

programmers.co.kr

문제의 핵심

1. 숫자열의 각 자리수를 떼어내는 아이디어를 구현할 수 있는가?

2. 문자열을 통해서 푸는 방식과 정수형만으로 푸는 방식.

(정수형만 가지고 푸는 방식이 훨씬 중요함)

 


 

이전 포스팅에서 프로그래머스의 <하샤드 수>라는 문제 풀이를 올렸는데

지금 이 문제의 풀이를 먼저 올렸어야했다.

<하샤드 수> 문제를 해결하려면 지금 이 문제의 풀이과정을 반드시 거쳐야 하기 때문이다.

만약에, 이 문제를 풀었다면 곧장 하샤드 수를 풀면 된다.

 

가장 쉽고 기본적인 방법은 

정수형을 문자형으로 바꿔서 한글자씩 떼어와서 다시 정수형을 바꿔서 합산하는 방식이다.

이게 가장 간단하고 떠올리기 쉬운 방식이지만,

문자열을 사용한다는 점과 형식변환이 빈번하기 때문에 속도가 느리다.

 

 

 

약간의 수학적 아이디어를 발휘한다면,

문자열을 사용하지 않고 오로지 정수형으로 계산을 할 수 있다.

방법은 다음과 같다.

 

1. 입력된 숫자 n을 10으로 나눈 나머지를 구한다.

2. 나머지를 answer에 더해준다.

3. n을 10으로 나눈다.

4. n이 0보다 크다면 1~3번을 반복한다.

 

이 과정을 코드로 작성해주면 놀랍게도 정수형만 가지고 자릿수 합산이 가능해진다.

answer += n % 10;

n / 10

 

n을 10으로 나눠서 발생한 나머지는 현재 n의 1의 자리수와 동일하다.

따라서 나머지를 answer에 더하면 n의 한자리를 더해준게 된다.

그리고나서 n을 10으로 나누게 되면 몫만 남게되므로 1의자리수가 사라지게된다.

(방금 answer에 더했던 숫자가 n에서 사라짐)

그리고나서 다시 10으로 나눈 나머지는

아까 전에는 10의자리수였던 숫자가 1의 자리가 되었기 때문에 새로운 숫자이다.

고로, 이 과정을 반복하면 모든 자리수를 한번씩 더할 수 있게 된다.

 

 

 

정답 코드 - 문자열을 활용해서 풀기

using System;

public class Solution
    {
        public int solution(int n)
        {
            int answer = 0;
            // 입력된 값을 문자열로 변환한다.
            string temp = n.ToString();
            // for문을 돌려서 문자열의 한글자한글자를 int형으로 바꿔서 answer에 더한다.
            for (int i = 0; i < temp.Length; i++)
            {
                answer += (int)Char.GetNumericValue(temp[i]);
            }
            return answer;
        }
    }

정답 코드 - 오로지 숫자로만 해결하기

using System;

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

 

 

 

반응형

댓글