환상상상속상 2020. 4. 16. 10:54

 

[첫번째 생각]

맨 처음에는 54321을 나눠준다고 생각했다.

그러니깐 54321을 10000으로 나누면 5

4321을 1000으로 나누면 4

321을 100으로 나누면 3

같은 방식으로 나누면 5 + 4 + 3 + 2 + 1이 가능하다.

 

아래와 같은 코드로 생각했다.

temp = pow(10,N);

for(i = 0; i < N; i++){

sum += input/temp;

input -= (input/temp)*temp;

temp /= 10;

}

 

[문제점 발생]

그런데, 1000000000000이 되면서 나눠주는 숫자가 10^10 즉, 원래 int의 크기를 벗어나게 되면서 큰 자리의 숫자는 나눌 수 없었다.

즉, overflow가 발생했다.

 

[두번째 생각]

그래서 나는 차라리 문자열로 받아서 각 문자열을 아스키코드의 성질을 이용해서 한글자한글자 더하기로 했다.

gap = 9 - '9'는 8 - '8'도 된다. 모두 다 똑같은 갭을 갖기 때문이다. 아래는 최종 코드다.

 

 

#include <stdio.h>

#include <string.h> //strcpy함수

#include <stdlib.h> //malloc함수

#define MAX_STR 100 //문제의 조건

 

int main(int argc, const char * argv[]) {

    int N,i,sum = 0;

    int gap = '9' - 9;

    char str[MAX_STR];

    

 

    scanf("%d",&N);

    scanf("%s",str);

    

    char *number = (char*)malloc(N*sizeof(char)); //N크기만큼 동적할당 받기

    strcpy(number,str);

    

    for(i = 0; i < N; i++) {

        sum += number[i] - gap;

    }

    

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

    

    

    

    return 0;

}

 

 

오키 풀었당

 

[훨씬 쉬운 코드]

 

#include <stdio.h>

void main() {

    int input, i, sum = 0;

    char inArr[101= {};

    scanf("%d"&input);

    scanf("%s", inArr);

    

    for(i = 0; i < input; i++)

        sum += inArr[i] - '0';

    printf("%d", sum);

}

 

[결론]

아스키코드 숫자 n에서 숫자 0만큼 빼면, 숫자에 대한 정수 값을 구할 수 있다.