백준 8단계 숫자의 합
[첫번째 생각]
맨 처음에는 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만큼 빼면, 숫자에 대한 정수 값을 구할 수 있다.