티스토리 뷰

 

이번 포스팅은 백준 알고리즘 사이트의 4673번 셀프 넘버 문제를 C 언어로 코딩해보도록 하겠습니다. 아래 url로 접속하시면 문제를 볼 수 있습니다.

 

https://www.acmicpc.net/problem/4673

 

이번 포스팅은 새로운 단계인 함수 사용하기 단계의 첫 문제입니다.

 

 

이 문제의 경우 입력 없이 함수를 사용해 10000까지의 셀프 넘버를 모두 출력하는 문제입니다. 셀프 넘버란 생성자 없이 존재하는 수로 아래 그림을 보시면 이해하는데 도움이 될 것 같습니다.

 

 

숫자 2는 1을 통해 만들어지고, 숫자 4는 2를 통해 만들어지기에 셀프 넘버가 아닙니다. 그렇다면 10 이하의 수에서는 1, 3, 5, 7, 9가 대표적인 셀프 넘버가 될 것입니다. 이런식으로 10000까지의 모든 셀프 넘버를 출력하면 됩니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
int self_num();
int main() {
    self_num();
    return 0;
}
int self_num(){
    int i, arr[10001= {0}, res = 0;
    for (i = 1; i <= 10000; i++){
        if(i < 10){
            res = i+i;
            arr[res] = 1;
        }
        else if(i < 100){
            res = i + (i/10+ (i%10);
            arr[res] = 1;
        }
        else if(i < 1000){
            res = i + (i/100+ ((i%100)/10+ ((i%100)%10);
            arr[res] = 1;
        }
        else if(i < 10000){
            res = i + (i/1000+ ((i%1000)/100+ (((i%1000)%100)/10+ (((i%1000)%100)%10);
            if (res <= 10000)    arr[res] = 1;
        }
    }
    
    for(i = 1; i <= 10000; i++){
        if(arr[i] != 1)
            printf("%d\n", i);
    }
    return 0;
}

 

이 문제는 함수 사용하기의 문제기에 main은 self_num()이라는 함수를 호출하는 코드가 전부이기에 중점적으로 봐야 할 것이 self_num() 함수가 됩니다.

 

self_num() 함수는 10001만큼의 배열인 arr를 모두 0으로 초기화 시키고, 셀프 넘버인지를 구하기 위한 res 변수가 있습니다.

 

for문을 10000까지 반복시키고 if/else if문을 이용해 각 자리수에 따라 조건을 설정해주었습니다. 자리수의 차이로 if문을 나누었기에 코드 동작 방식이 동일하기에 18라인의 else if문을 대표적으로 보여드리도록 하겠습니다. 18라인은 1000이하의 i의 조건으로 3자리 수를 통한 셀프 넘버를 구하기 위한 코드입니다.

 

res값에 i + (i/100) + ((i%100)/10) + ((i%100)%10) 값을 넣어주는데, 이는 i값에 i값 각 자리수를 더하는 코드 입니다. 예를 들어 i가 365면 res에는 365+3+6+5로 379가 저장되게 되는 것입니다.

 

res값을 구했으면 만들어놨던 arr의 res에 해당하는 배열에 1을 채워줍니다. arr[res] = 1로 1이 들어간 res 수는 셀프넘버가 아니라는 것을 나타냅니다.

 

다른 코드 동작은 동일하지만 24라인은 예외 처리를 한번 더 해주었습니다. 10000을 생성자로 둔 셀프넘버를 다 구하기에 res값이 10000이 넘지 않을 때까지만 arr[res]에 1을 넣어주게 되는 처리입니다.

 

이후에 for문을 통해 10000까지 반복하면서 arr[i]의 값이 1이 아니면 해당 i를 출력하는 코드를 작성함으로 self_num() 함수 작성을 마칠 수 있습니다.

 

 

다음 포스팅에서는 다음 문제를 풀어보도록 하겠습니다.

 

다음 포스팅에서 봐요: ))

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함