리그캣의 개발놀이터

백준 알고리즘 4673번 셀프 넘버 본문

알고리즘/백준

백준 알고리즘 4673번 셀프 넘버

리그캣 2018. 1. 11. 14:11

안녕하세요


리그캣 입니다.


알고리즘 포스팅을 시작하겠습니다.


1,2,3학년 동안 아르바이트와 프로젝트에만 매진하다 보니 알고리즘 공부를 소홀리 했네요 ㅠㅠ


핸드폰으로 오목하듯이 알고리즘 게임을 하는 날이 있기를..


백준선생님의 4673번 문제 입니다.


문제 설명



출력 화면


초기 풀이 소스


#include <stdio.h>


int selfNum(int n);


int main() {
    int i;
    int k[10001];


for (i = 1; i < 10001; i++) {
    k[selfNum(i)] = 1;             //selfNum(i) 즉 i를 넣었을 때 나오는 셀프값 즉, k[셀프값] 을 1로 세팅해줍니다.
    printf("무한루프ㅠㅠ");   <<-- 여기서 무한 루프가 발생했어요!!
}


for (i = 1; i < 10001; i++) {
    if (k[i] != 1)                        //k[셀프값이아닌것들] 을 출력해 줄 것입니다.
    printf("%d\n", i);
}


return 0;
}


int selfNum(int n) {
int sum = n;

if (n >= 10000) {
    sum += n / 10000;
    n %= 10000;
}
if (n >= 1000) {
    sum += n / 1000;
    n %= 1000;
}
if (n >= 100) {
    sum += n / 100;
    n %= 100;
}
if (n >= 10) {
    sum += n / 10;
    n %= 10;
}

return sum;

}




초기 소스코드 입니다. 생성자를 가진 숫자를 판별하여 1(true)로 바꾸어 줍니다.


배열에서 1이 아닌 남아있는(false) 숫자를 출력합니다!!


그러나 저는 오류가 발생하였는데요 자세히 확인해 보니


int n에 10000이 들어왔을 겨우 그 이상의 숫자가 나올 수 있고 


또한 


n이 10이하인 경우를 처리 하지 못 하였습니다.


오늘도 하루종일 반성하며..... 


최종 풀이 소스


 #include <stdio.h>


int selfNum(int n);

int main() {
    int i;
    int k[20001];    //수정되었음

    for (i = 1; i < 10001; i++) {
        k[selfNum(i)] = 1;
    }
    for (i = 1; i < 10001; i++) {
        if (k[i] != 1)
        printf("%d\n", i);
    }
return 0;
}

int selfNum(int n) {
    int sum = n;

    if (n >= 10000) {
        sum += n / 10000;
        n %= 10000;
    }
    if (n >= 1000) {
        sum += n / 1000;
        n %= 1000;
    }
    if (n >= 100) {
        sum += n / 100;
        n %= 100;
    }
    if (n >= 10) {
        sum += n / 10;
        n %= 10;
    }
    if (n <10){            //수정 되었음.
        sum+=n;
    }

return sum;

}


감사합니다!!(코무여서 죄송합니다 ㅠㅠ)


Comments