넥슨 입사문제 중에서

어떤 자연수 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 보다 작은 모든 셀프 넘버들의 합을 구하라.

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

364개의 풀이가 있습니다. 1 / 37 Page

go로 풀어봤습니다.

// ysoftman
package main

import (
    "fmt"
)

const mxvalue int = 5000

func main() {
    var result map[int]int
    result = make(map[int]int)
    for i := 1; i < mxvalue; i++ {
        result[i] = 0
    }
    for i := 1; i < mxvalue; i++ {
        temp := i
        sum := 0
        for temp > 0 {
            sum += temp % 10
            temp = temp / 10
        }
        sum += i
        // fmt.Println(i, "->", sum)
        result[sum] = 1
    }
    sum := 0
    for i := 1; i < mxvalue; i++ {
        if result[i] == 0 {
            // fmt.Println(i)
            sum += i
        }
    }
    fmt.Println(sum)
}

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
/*
프로그램 내용 : 어떤 자연수 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 보다 작은 모든 셀프 넘버들의 합을 구하라.

작성한 날짜   : 2017년 6월 20일
*/
#include <stdio.h>

#define len 5000

int d(int num)
{
    int sum = num;  //처음 숫자를 저장

    while (num > 0)
    {
        sum += num % 10;    
        num /= 10;  //num이 0이될때 까지 저장한다
    }

    return sum;
}

int main()
{
    int gen[len] = { 0 };
    int sum = 0;

    for (int i = 1; i < len; i++)
    {
        if (d(i) < len) //5000보다 작으면 실행
        {
            gen[d(i)] = 1;  //1로 체크
        }
    }

    for (int i = 1; i < len; i++)
    {
        if (gen[i] == 0)
        {
            sum += i;   //제네레이터가 없는 셀프넘버 합 계산
        }
    }

    printf("%d\n", sum);

    return 0;
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
array={0}
for i in range(5001):
    array.add(i)


for a in range(10):
    for b in range(10):
        for c in range(10):
            for d in range(10):
                array = array - {1001*a+101*b+11*c+2*d}

_sum = 0
listarray = list(array)

for j in range(len(listarray)):
    _sum = _sum + listarray[j]

2017/06/21 09:53

hgj

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

int main(void)
{
    int sum_seq = 0;
    int judge = 0;
    int sum = 0;
    int a, b, c, d;
    int i;

    for (i = 0;i < 5000;i++) {
        sum_seq += i;
    }

    for (i = 0;i < 5000;i++) {
        judge = 0;
        for (a = 0; a < 5; a++) {
            for (b = 0; b < 10; b++) {
                for (c = 0;c < 10; c++) {
                    for (d = 0; d < 10; d++) {
                        if (i == 1001 * a + 101 * b + 11 * c + 2 * d) {
                            sum += i;
                            judge += 1;
                            break;
                        }
                    }
                    if(judge!=0)
                    break;
                }
                if (judge != 0)
                break;
            }
            if (judge != 0)
            break;
        }
    }

    printf("sum = %d", sum_seq - sum);

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

for i in range(1,5001):
    lir.append(i)

for i in range(1,5001):
    print(i)
    for j in range(1,5001):
        a = j//1000
        b = (j-a*1000)//100
        c = (j-a*1000-b*100)//10
        d = (j-a*1000-b*100-c*10)
        if a+b+c+d+j == i:
            if lir.count(i) != 0:
                lir.remove(i)

for i in lir:
    ans += i

print(ans)

포문으로 간단하게 해봤습니다..

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

javascript(ES6)

var selfnumbers = Array.from(Array(5000), (_, i) => i + 1);
var add = (a, b) => a + b;
var str2int = s => parseInt(s, 10)
var gen = n => n + ("" + n).split('').map(str2int).reduce(add);

for (let i = 1; i <= 5000; i++) {
    selfnumbers[gen(i) - 1] = 0;
}

var sum = selfnumbers.reduce(add);

console.log(sum);

for 문 없이 아래와 같이 할 수도 있는데, 그러면 selfnumbers 가 chain 되지 않아서 .reduce 를 chain 할 수가 없음

selfnumbers.map((v, i, a) => { a[gen(i + 1) - 1] = 0 })
var sum = selfnumbers.reduce(add);
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

sum(set(range(1, 5000)) - {x + sum([int(a) for a in str(x)]) for x in range(1, 5000)})

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

파이썬(은 사랑) 입니다

def self_number(): 
    li = []
    for i in range(1,5001):
        li.append(i + sum([int(j) for j in str(i)]))

    return sum(set(range(1,5001)) - set(li))
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
// 넥슨 입사 문제: 셀프 넘버 - C#

using System;
using System.Collections.Generic;

namespace selfnumber
{
    class nana
    {
        static void Main(string[] args)
        {
            List<int> generator = new List<int>();
            List<int> self = new List<int>();

            for (int i = 1; i < 5000; i++)
            {
                if (i < 10)
                    generator.Add(i + i);
                else if (i < 100)
                    generator.Add(i / 10 + i % 10 + i);
                else if (i < 1000)
                    generator.Add(i / 100 + i / 10 % 10 + i % 10 + i);
                else
                    generator.Add(i / 1000 + i / 100 % 10 + i / 10 % 10 + i % 10 + i);
            }
            generator.Sort();
            for (int i = 0; i < 5000; i++)
                if (!(generator.Contains(i)))
                    self.Add(i);

            int sum = 0;
            foreach (int i in self)
                sum += i;
            Console.WriteLine(sum);
            // 답은 1227365
        }
    }
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

c로 풀이


#include <stdio.h>
int generator(int n);
int same_gen(int n);
int main(void)
{
    int i,sum=0;
    for(i=1;i<=5000;i++) sum=sum+i-(same_gen(i)*generator(i));
    printf("%d",sum);
    return 0;
}
int generator(int n)
{
    int m;
    m=(n+(n/1000)+((n%1000)/100)+((n%100)/10)+(n%10));
    if (m<=5000) return m;
    else return 0;
}
int same_gen(int n)
{
    int i,num=0;
    for(i=n+1;i<=5000;i++) if(generator(i)==generator(n)) num++;
    if (num==0) return 1;
    else return 0;
}

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

풀이 작성

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

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


언어별 풀이 현황
전 체 x 364
go x 1
objectivec x 5
python x 119
기 타 x 58
javascript x 5
cs x 15
cpp x 56
java x 67
matlab x 5
scala x 8
php x 6
delphi x 3
r x 2
ruby x 6
haskell x 2
lisp x 2
clojure x 2
perl x 1
erlang x 1