넥슨 입사문제 중에서

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

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

4개의 풀이가 있습니다.

swift로 작성해보았습니다




let MIN_NUMBER = 1
let MAX_NUMBER = 5000

// 숫자 제네레이터 함수
// ex) d(91) = 9 + 1 + 91 = 101
func generator(number : Int) -> Int{

    var total = 0
    for char in Array(String(number)){
        total += String(char).toInt()!
    }

    return total + number
}

// number hashSet
var entireNumbers : Set<Int> = Set<Int>(MIN_NUMBER...MAX_NUMBER)

// 주어진 범위에서 generator에 의해 생성 된 값을 제거
for num in MIN_NUMBER...MAX_NUMBER{
    entireNumbers.remove(generator(num))
}

// 남아있는 hashSet 요소들이 셀프 넘버이므로 요소들을 모두 더한다.
let sum = reduce(entireNumbers, 0, {return $0 + $1})
println(sum)
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
#include <stdio.h>
int generator(int n,int j);
int main(void){
        int arr[5000];
        int i,j,k,gencheck,sum=0;
        for(i=0;i<5000;i++){
                arr[i]=(i+1);
        }
        for(i=0;i<5000;i++){
                for(j=0,k=i;;j++){
                        k=k/10;
                        if(k<=0)
                                break;
                }
                gencheck=generator(i,j);
                if(gencheck<5000){
                        arr[gencheck-1]=0;
                }
        }
        for(i=0;i<5000;i++){
                printf("arr[%d]=%d\n",i,arr[i]);
                sum+=arr[i];
        }
        sum-=5000;
        printf("%d\n",sum);
        return 0;
}
int generator(int n,int j){
        int sum=n;
        double i=10;
        for(;j>-1;j--){
                sum+=(n%10);
                n/=10;
                i*=10;
        }
        return sum;
}

휴,,,,,, 방식은 길이5000배열에 1부터 5000까지 넣어놓고 제너레이트가 있는 배열값을 전부 0으로 바꾼뒤 전부 더해주는겁니다,, 5000보다 적은수라고 해서 마지막 5000을 빼주었습니다.

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

결과값은 1227365가 나왔어요 조금은 무식하게 짠거 같네요..

#include <stdio.h>

int main(void)
{
    int i = 0;
    int result = 0;
    int sum = 0;
    int num[5000]= {0,};

    for(i=0; i<5000; i++){
        num[i] = i+1;
    }

    for(i=0; i<5000; i++){
        result = d(i);
        printf("d(%d)  = %d \r\n", i, result);

        if((result < 5001) && (result != 0)){
            num[result-1] = 0;
        }
    }


    for(i=0; i<5000; i++){
        sum += num[i];
    }

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

    return 0;
}


int d(int a){

    int result = a;
    int num = a;

    while(num != 0){
        result += num%10;
        num = num/10; 
    }

    return result;
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
// 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 입니다.

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

풀이 작성

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

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


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