[11720] 숫자의 합 C++ 백준

pyungjong·2023년 9월 10일

C++ 백준

목록 보기
3/8

백준[11720]

문제

11720번 숫자의 합

1번째 풀이

  • 숫자의 자릿수를 받고 다음에 숫자를 입력받는다.
  • 숫자의 자릿수를 반복해서 자릿수를 더해주기 때문에 반복문을 사용한다.
  • 큰 자릿수부터 더해준다.
  • 자릿수는 10을 반복적으로 곱해주어 계산한다.
  • 입력받은 숫자를 자릿수로 나누어주어 몫은 더해주고 다음 계산을 위해 나머지 숫자를 나타낸다.
#include <iostream>

using namespace std;

int main(void) {
	int N;
	long long M;
	int sum = 0;
	cin >> N;
	cin >> M;

	for (int i = N; i > 0; i--) {
		long long num = 1;
		for (int j = i-1; j > 0; j--) {
			num = num * 10;
		}
		sum = sum + (M / num);
		M = M % num;
		if (M == 0)
			break;
	}
	cout << sum;

	return 0;
}

위의 코드는 N이 10보다 작은 경우에는 문제 없이 동작하였다.
하지만 N이 10보다 커지는 경우 예상하지 못하는 값이 나왔다.
이러한 문제는 변수 M과 num에 너무 큰 수가 들어가서 런타임 에러 (IntegerOverflow)가 발생한 이유였다.

2번째 풀이

  • N은 숫자로 입력을 받는다.
  • 이번에는 다음 숫자를 문자열로 받았다.
  • 문자열로 받은 숫자를 정수형 값으로 변환한다.
  • 아스키코드 값이 48 차이난다.
  • sum에 계산 값을 더하여 준다.
#include <iostream>

using namespace std;

int main(void) {
	int N;
	char M;

	cin >> N;
	int sum = 0;

	for (int i = 0; i < N; i++) {
		cin >> M;
		sum += M - 48;
	}

	cout << sum;

	return 0;
}

느낀점

1. 제곱이나 자릿수가 큰 경우에 IntegerOverflow가 발생할 수 있다.
2. 자료형의 크기를 벗어나는 경우 예상하지 못한 값이 출력된다.
3. 숫자와 관련된 문제로 보여도 문자열로 풀고 숫자로 변환하는 방식이 더 간단한 경우가 있다.

profile
코린이

0개의 댓글