넥슨 입사문제 중에서

어떤 자연수 n이 있을 때, d(n)을 n의 각 자릿수 숫자들과 n 자신을 더한 숫자라고 정의하자.

예를 들어

d(91) = 9 + 1 + 91 = 101

이 때, n을 d(n)의 제네레이터(generator)라고 한다. 위의 예에서 91은 101의 제네레이터이다.

어떤 숫자들은 하나 이상의 제네레이터를 가지고 있는데, 101의 제네레이터는 91 뿐 아니라 100도 있다. 그런데 반대로, 제네레이터가 없는 숫자들도 있으며, 이런 숫자를 인도의 수학자 Kaprekar가 셀프 넘버(self-number)라 이름 붙였다. 예를 들어 1,3,5,7,9,20,31 은 셀프 넘버 들이다.

1 이상이고 5000 보다 작은 모든 셀프 넘버들의 합을 구하라.

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

339개의 풀이가 있습니다. 1 / 34 Page

import java.util.ArrayList;
import java.util.HashSet;

public class test {

    public static void main(String[] args) {

        int one;
        int ten;
        int hundred;
        int thousand;
        ArrayList noSelfNumber = new ArrayList();

        for(int i=1 ; i<=5000 ; i++)
        {
            if(i>=1 && i<10)
            {
                one = i;
                noSelfNumber.add(one+i);
            }
            else if(i>=10 && i<100)
            {
                one = i%10;
                ten = i/10;
                noSelfNumber.add(one+ten+i);
            }
            else if(i>=100 && i<1000)
            {
                one = i%10;
                hundred = i/100;    
                ten = i/10 - hundred*10;
                noSelfNumber.add(one+ten+hundred+i);
            }
            else if(i>=1000 && i<=5000)
            {
                one = i%10;
                thousand = i/1000;
                hundred = i/100-thousand*10;
                ten = i/10-thousand*100-hundred*10;
                noSelfNumber.add(one+ten+hundred+thousand+i);
            }   
        }

        HashSet noDupl = new HashSet(noSelfNumber);
        ArrayList noSelfNumber2 = new ArrayList(noDupl);

        int sum = 0;
        int nosum = 0;
        for(int i=0; i<=5000; i++){
            sum+=i;
            if(i<noSelfNumber2.size() && (Integer)noSelfNumber2.get(i)<=5000)
                nosum+=(Integer)noSelfNumber2.get(i);
        }

        System.out.println(sum-nosum);

    }

}

1227365! - APeach KaKao, 2017/04/27 13:27 M D
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
        private void Generator(int num)
        {
            int sum = 0;
            int res = 0;
            num++;
            bool[] std = new bool[num];
            string str = "";

            for (int i = 1; i < num; i++)
            {
                res = makeGenerator(i);
                if(res < num)
                    std[res] = true;
            }

            for (int i = 1; i < num; i++)
            {
                if (!std[i])
                {
                    str += string.Format(" {0} ", i);
                    sum += i;
                }
            }

            MessageBox.Show(str + "총 합 = " + sum.ToString()); 
        }

        private int makeGenerator(int num)
        {
            int sum = num;
            string str = num.ToString();
            for (int i = 0; i < str.Length; i++)
                sum += Convert.ToInt32(str[i].ToString());

            return sum;
        }
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

파이썬 막 공부중입니다. 숫자 구간의 list를 미리 만들어 두고, generator를 제외한 후 남은 숫자를 더하는 방법으로 풀었습니다.

min_num, max_num = 1, 5000
chk_num, gen_num, sum_num = 0, 0, 0
self_num_list = []

def Generator(num):
    gen = num
    while num > 0 :
        mod = num % 10
        num = num // 10
        gen += mod
    return gen

print("%d ~ %d 사이의 self-number 합 구하기" % (min_num, max_num))

self_num_list = list(range(min_num, max_num+1))

for chk_num in range(min_num, max_num+1) :

    gen_num = Generator(chk_num)

    if gen_num <= max_num :
        try :
            self_num_list.remove(gen_num)
        except ValueError :
            pass

for i in range(0, len(self_num_list)) :
    sum_num += self_num_list[i]

print("합 : %d" % sum_num)
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
/*************************************************

java version "1.8.0_101" 64bits 

MacOS 10.12.4
Eclipse Neon.3 Release 4.6.3

어떤 자연수 n이 있을 때, d(n)을 n의 각 자릿수 숫자들과 n 자신을 더한 숫자라고 정의하자.
예를 들어
d(91) = 9 + 1 + 91 = 101
이 때, n을 d(n)의 제네레이터(generator)라고 한다. 위의 예에서 91은 101의 제네레이터이다.
어떤 숫자들은 하나 이상의 제네레이터를 가지고 있는데, 101의 제네레이터는 91 뿐 아니라 100도 있다. 
그런데 반대로, 제네레이터가 없는 숫자들도 있으며, 이런 숫자를 인도의 수학자 Kaprekar가 
셀프 넘버(self-number)라 이름 붙였다. 예를 들어 1,3,5,7,9,20,31 은 셀프 넘버 들이다.
1 이상이고 5000 보다 작은 모든 셀프 넘버들의 합을 구하라.

1. 제네레이터가 없는 숫자가 셀프 넘버이기 때문에 전체 숫자에서 제네레이터를 지우는 형태로 찾아야한다.
   이를 위해서는 엘리먼트의 추가/삭제가 용이한 ArrayList를 이용한다.
2. Generator를 구하기 위한 함수를 별도로 만들어서 코드의 시인성을 높인다.

결과 : 1227365

고생했던 부분
1. ArrayList에서 엘리먼트를 삭제할 때 remove() 메쏘드를 사용했는데,
   remove()의 오퍼랜드로 integer를 입력하면 해당 숫자를 찾아 지우는 것이 아니라
   삭제할 엘리먼트의 인덱스 번호로 인식을 한다.
   즉 remove("A")라고 하면 "A"라는 엘리먼트를 삭제하지만
   remove(5)라고 하면 5번째 엘리먼트를 삭제한다.
   이때는 indexOf() 메쏘드를 사용하면 된다.
***************************************************/

import java.util.ArrayList; 
import java.lang.Math;

public class Java_generator {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int N = 5000;
        ArrayList<Integer> sn = new ArrayList<Integer>();

        for (int i = 1; i <= N; i++){
            sn.add(i);
        }

        int gen = 0;
        for (int i = 1; i <= N; i++){
            gen = generator(i);
            if(sn.contains(gen)){
                sn.remove(sn.indexOf(gen));
            }
        }

        int result = 0;
        for (int i = 0; i < sn.size(); i++){
            result = result + sn.get(i);
        }
        System.out.println(result);
    }

    public static int generator(int number){
        int result = number;
        int length = (int)Math.log10(number);
        for(int i = 0; i <= length; i++){
            result = result + (number % 10);
            number = (int)number/10;
        }
        return result;
    }

}

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
range(1, 5000).filter(i -> range(1, i).filter(j -> (String.valueOf(j).chars().map(x -> x - '0').sum() + j == i)).sum() == 0).sum();

자바 8

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

k = 0
T = []
G = set(range(1,5000)) 

for i in range(1,5000):
    for j in str(i):
        k+=int(j)
    T.append(k+i)
    k = 0

print sum(G-set(T))
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
import java.util.Arrays;
class Practice02 {
    public static void main(String[] args) {

        int[] arr = Math_arr.selfNumArr(5000);

        System.out.println(Arrays.toString(arr));
    }
}

import java.util.Arrays;
class Practice02 {
    public static void main(String[] args) {

        int[] arr = Math_arr.selfNumArr(35);

        System.out.println(Arrays.toString(arr));
    }
}

class Math_arr {
    // 1 ~ v 사이의 self-number들로 구성된 배열을 반환하는 메서드
    static int[] selfNumArr(int v){
        int[] arr = new int[v];

        // 1. arr 배열에 1 ~ v 까지 저장
        for(int i = 0 ; i < v ; i++){
            arr[i] = i+1;
        }

        // 2. arr 배열에서 self-number가 아닌 값들은 전부 0으로 변환
        for(int i = 1 ; i <= v ; i++){
            int temp = i;
            int temp_sum = 0;
            while(temp > 0){
                temp_sum += temp%10;
                temp /= 10;
            }

            temp_sum += i;
            if(temp_sum-1 < v){
                arr[temp_sum-1] = 0;
            }
        }

        // 3. arr 배열에서 self-number의 개수를 구해서 cnt에 저장
        int cnt = 0;
        for(int o : arr){
            if( o != 0 ){ 
                cnt++; 
            }
        }

        // 4. 크기가 cnt만큼인 arr_ret배열을 생성
        int[] arr_ret = new int[cnt];

        // 5. cnt 만큼 반복문 ; arr 배열에서 0이 아닌값을 만날때마다 
        // arr_ret배열에 값을 추가
        int idx = 0;
        for(int i = 0 ; i < cnt ; i++){
            while(true){
                if(arr[idx] != 0){
                    arr_ret[i] = arr[idx];
                    idx++;
                    break;
                }else{
                    idx++;
                }
            }
        }

        return arr_ret;

    }
}

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
package training;

import java.util.ArrayList;

// d(91) = 9 + 1 + 91 = 101
public class NGenerator {

    public static void main(String[] args) {
        int iSum = 0;       
        ArrayList<Integer> arr = new ArrayList();

        for(int i=1;i<5000;i++){
            if(isSelfNum(i)){
                arr.add(i);
                iSum += i;
            }
        }
        System.out.println(arr);
        System.out.println("Sum of all Self number between 1 to 5000 : " + iSum);
    }

    public static boolean isSelfNum(int iNum){
        boolean isSelfNum = true;
        for(int i=1;i<iNum;i++){
            if(iNum == generator(i)){
                isSelfNum = false;
            }
        }
        return isSelfNum;
    }

    public static int generator(int iNum){
        String strNum = String.valueOf(iNum);
        int iSum = 0;
        for(int i=0;i<strNum.length();i++){
            iSum += Integer.parseInt(strNum.substring(i, i+1));
        }
        return iSum+iNum;
    }

}

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
private static int sumOfSelfNum(int n){
        boolean generators[] = new boolean[n];

        for(int i=1; i<=n; i++){
            int sum = i;
            sum += i % 10;
            sum += (i / 10) % 10;
            sum += (i / 100) % 10;
            sum += (i / 1000);

            if(sum <= n){
                generators[sum-1] = true;
            }
        }

        int sumOfSelfNum = 0;
        for(int j=0; j<generators.length; j++){
            if(generators[j] == false){
                sumOfSelfNum += (j+1);
            }
        }

        return sumOfSelfNum;
    }
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
xx = []
for i in range(1,5001):
    if i >= 1000:
        a1 = i // (10**3)
        b1 = (i - a1 * (10**3)) // (10**2)
        c1 = (i - a1 * (10**3) - b1 * (10**2)) // 10
        d1 = (i - a1 * (10**3) - b1 * (10**2) - c1 * 10)
        x1 = (a1+b1+c1+d1+i)
        xx.append(x1)
    elif i >=100:
        a2 = 0
        b2 = i//(10**2)
        c2 = (i - b2 * (10**2)) // 10
        d2 = (i - b2 * (10**2) - c2 * 10 )
        x2 = (a2+b2+c2+d2+i)
        xx.append(x2)

    else:
        a3 = 0
        b3 = 0
        c3 = i//10
        d3 = (i-c3*10)
        x3= (a3 + b3 + c3 + d3 + i)
        xx.append(x3)

xxx = list(set(xx))
kk = []
for k in range(1,5001):
    if k not in xx:
        kk.append(k)
        ksum =sum(list(kk))

print(ksum)

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

풀이 작성

※ 풀이작성 안내
  • 본문에 코드를 삽입할 경우 에디터 우측 상단의 "코드삽입" 버튼을 이용 해 주세요.
  • 마크다운 문법으로 본문을 작성 해 주세요.
  • 풀이를 읽는 사람들을 위하여 풀이에 대한 설명도 부탁드려요. (아이디어나 사용한 알고리즘 또는 참고한 자료등)
  • 작성한 풀이는 다른 사람(빨간띠 이상)에 의해서 내용이 개선될 수 있습니다.
목록으로
코딩도장

코딩도장은 프로그래밍 문제풀이를 통해서 코딩 실력을 수련(Practice)하는 곳입니다.


언어별 풀이 현황
전 체 x 339
java x 66
cs x 14
python x 109
cpp x 54
기 타 x 50
matlab x 5
objectivec x 4
scala x 8
php x 6
javascript x 4
delphi x 3
r x 2
ruby x 6
haskell x 2
lisp x 2
clojure x 2
perl x 1
erlang x 1