Training/BOJ

[C++] 11720 숫자의 합

FATKITTY 2020. 7. 20. 02:12
반응형

 

처음에 이걸 어떻게 풀지 고민할 때,

'입력을 string으로 받은 다음에

stoi 함수를 이용해서 int로 바꾸고,

계속 10으로 나눈 나머지를 더한 결과를 출력하면 되겠네!'

라고 생각했다.

그대로 구현하다 보니 미처 고려 못 한 부분이 있었다.

둘째 줄에 입력받을 숫자는 1개 이상 100개 이하다.

즉, 최대 100개의 자릿수를 가진 매우 큰 숫자가 입력될 수도 있다.

그런 큰 숫자는 int형으로 변환될 수 없다.

int형이 표현할 수 있는 가장 큰 수는 2,147,438,647 밖에 안 되기 때문.

그렇다면 int 보다 더 큰 자료형인 long long으로 변환하면 해결될까?

그것 또한 아니다.

long long이 제 아무리 int 보다 두 배의 메모리 공간을 가지고

수용할 수 있는 범위가 크더라도,

계산 가능한 양의 정수 최댓값은 9,223,372,036,854,775,807이다.

이 숫자도 물론 크다.

하지만 이 문제에서 입력될 수 있는 숫자는 저 숫자보다 훨씬 더 클 수 있다는 사실.

그렇다면 어떻게 해야할까?

형변환을 해야한다는 생각 자체가 잘못 됐던 것이다.

그냥 string으로 입력 받은 것 그대로 이용해 for문을 돌리면 된다.

string의 문자 하나하나를 char로써 추출해내면,

그 것 각각의 int형 변환은 쉬워진다.

char '0'~'9'를 10진수로 나타낸 값에서 48을 빼면, 10진수 정수 0~9가 된다.

(ASCII, '0' == 48, ... '9' == 57)

 

#include <iostream>
#include <string>

using namespace std;

int AddAll(string nums)
{
	int result = 0;
	for (int i = 0; i < nums.length(); i++)
	{
		// converting char to int according to ASCII
		result += (nums[i] - 48);
	}

	return result;
}

int main()
{
	int N;
	string Nums;
	cin >> N >> Nums;
	cout << AddAll(Nums);

	return 0;
}

 

반응형

'Training > BOJ' 카테고리의 다른 글

[C++] 2577 숫자의 개수  (0) 2020.08.03
[C++] 2562 최댓값  (1) 2020.08.03
[C++] 2439 별 찍기 - 2  (0) 2020.07.20
[C++] 15552 빠른 A+B  (0) 2020.07.20
[C++] 2741 N 찍기  (0) 2020.07.18