넥슨 입사문제 중에서

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

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

308개의 풀이가 있습니다. 1 / 31 Page

// Swift 3.0
var sum = 0;
func main() {
    var selfNumbers = [Int](repeatElement(0, count: 5000))
    for i in 0..<5000{
        let noneSelfNumer = generator(value: i + 1) - 1

        if noneSelfNumer < 5000{
            selfNumbers[noneSelfNumer] = 1
        }

        if selfNumbers[i] == 0{
            sum += i + 1
        }
    }
}

func generator(value: Int) -> Int{
    var stremNum = value;
    var sum = value;
    while stremNum != 0 {
        sum += stremNum % 10
        stremNum /= 10
    }
    return sum
}

main()
print(sum)

결과적으로 selfNumbers[i] 가 0이면 i+1 은 self-number 입니다.

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def createdn(n):
  tem = []
  for i in range(1,n+1):
    a = format(i,'04')
    sum = int(a[0]) + int(a[1])+ int(a[2])+int(a[3]) + int(a)
    tem.append(sum)
  return list(set(tem))

dn = [x for x in createdn(5000) if x<5000]
full = list(range(1,5000))
result = [x for x in full if x not in dn]

resultsum = 0
for i in result:
  resultsum += i

print(resultsum)

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

당연하게 짜봤습니다 ㅎㅎ

#include <iostream>
using namespace std;

int d(int);

int main() {
    int sum = 0;
    int arr[5000] = { 0 };

    for (int i = 1; i < 5000; i++) {
        arr[i - 1] = d(i);
    }

    // search self-number
    for (int i = 1; i < 5000; i++) {

        // in array
        for (int j = 0; j < 5000; j++) {
            if (arr[j] == i) {
                break;
            }

            if (j == 4999) {
                sum += i;
            }
        }
    }

    cout << sum << endl;

    return 0;
}

int d(int generator) {
    int temp = generator;
    int result = 0;

    while (temp > 0) {
        result += (temp % 10);

        temp = (temp / 10);
    }

    return result + generator;
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
result = []
result = set(range(1,5000)) - set(i + sum(int(stri) for stri in str(i)) for i in range(1,5000))
print(sum(result))
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

python 3.5.2

answer is .1227365

def main() :
    L = list(range(1,5000))
    for i in range(1,5000) :
        if L.count(g(i)) > 0 :
            L.remove(g(i))

    print(sum(L))


def g(n) :
    rt = 0
    for x in str(n) :
        rt += int(x)
    rt = rt + n
    return rt


if __name__ == '__main__' :
    L=[]
    main()


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

파이썬을 이제 막 배우기 시작해서 익히는 중입니다.

nums = list(range(1,5000))
for i in range(1, 5000):
    numstr = str(i)
    summ = i
    for j in range(len(numstr)):
        summ += int(numstr[j])
    if summ < 4999:
        nums[summ-1] = 0

selfnum = 0
for k in range(4999):
    selfnum += nums[k]

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

dev : peanutBro

date : 170218

content : 

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

*/

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

#include <iostream>
#include <string>
#include <stack>

using namespace std;

const int MAX_NUM = 5000;

int main(void)
{
    int resultNumber = 0;
    bool generatorCheck[MAX_NUM];

    for (int i = 0; i < MAX_NUM; i++)
    {
        generatorCheck[i] = false;
    }

    for (int i = 1; i <= MAX_NUM; i++)
    {
        int addNumber = i;
        char* buf = new char[4];
        _itoa(i, buf, 10);
        string numString(buf);
        for (int j = 0; j < numString.length(); j++)
        {
            addNumber += (numString[j] - '0');
        }
        if (addNumber >= 1 && addNumber <= MAX_NUM)
        {
            generatorCheck[addNumber - 1] = true;
        }
    }

    for (int i = 0; i < MAX_NUM; i++)
    {
        if (!(generatorCheck[i]))
        {
            resultNumber += i + 1;
            //cout << i + 1 << " ";
        }
    }
    cout << resultNumber << endl;

    return 0;
}

정답 : 1227365

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
**import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet**;

public class Generator {

    public static void main(String[] args) {
        int gen = 0;
        int gen2 = 0;
        int sum = 0;
        **ArrayList<Integer>** arr = new ArrayList<Integer>();
        HashSet<Integer> hs = new HashSet();

        arr.add(0);

        **for**(int i = 1; i < 5000; i++, gen = 0){
            gen += i;
            **for**(int j = i; j != 0; j /= 10){
                gen += (j % 10);
            }   
            arr.add(gen);
        }

        hs.addAll(arr);
        arr.clear();
        arr.addAll(hs);
        Collections.sort(arr);

        **for**(int i = 0; i <arr.size() - 1 && gen < 5000; i++){
            gen = arr.get(i + 1);
            gen2 = arr.get(i);
            **for**(; (gen-1) > gen2; gen--)
                **sum += gen;**
        }
        System.out.println(sum);

    }


}

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

Python으로 작성해봤는데, 처음이라 허접합니다. 많이 보고 배워야 겠어요.

j = [0] * 5001
i = 1
while i < 5000:
    t = 0
    for a in (str(i)):
        t += int(a)
    s = t + i
    if s < 5000:
        j[s] = s
    i += 1

i = 1
t = 0
while i < 5000:
    if j[i] == int(0):
        t += i
    i += 1

print(str(t))
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def d(n):
    n=str(n)
    result=0
    for i in n:
        result+=int(i)
    return result+int(n)

dlist = [d(i) for i in range(1,5001)]

result=0
for i in range(1,5001):
    if i not in dlist:
        result+=i
print(result)
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

풀이 작성

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

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


언어별 풀이 현황
전 체 x 308
erlang x 1
r x 2
clojure x 2
java x 56
scala x 8
python x 100
delphi x 3
javascript x 4
haskell x 2
perl x 1
cs x 11
기 타 x 47
matlab x 4
cpp x 49
lisp x 2
objectivec x 4
php x 6
ruby x 6