PS (C, C++)

[백준/C & C++] 8595 히든 넘버

최연재 2022. 11. 26. 00:37

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

 

8595번: 히든 넘버

첫째 줄에 단어의 길이 n (1 ≤ n ≤ 5,000,000)이 주어진다. 둘째 줄에는 단어가 주어진다. 단어는 알파벳 대/소문자와 숫자(0-9)로 이루어져 있다. 

www.acmicpc.net

C

#include <stdio.h>
#include <ctype.h>
char str[5000002];
int main()
{
	long long  n, result = 0, num=0;
	scanf("%lld", &n);
	scanf("%s", str);

	for (long long i = 0; i < n; i++)
	{
		if (!isdigit(str[i]))
		{
			result += num;
			num = 0;
		}
		else num = num * 10 + (str[i] - '0');
	}
	result += num;
	printf("%lld", result);
	return 0;
}

C++

#include <iostream>
#include <cctype>
using namespace std;

char str[5000002];
int main()
{
	long long n, result = 0, num = 0;
	cin >> n;
	cin >> str;

	for (long long i = 0; i < n; i++)
	{
		if (!isdigit(str[i]))
		{
			result += num;
			num = 0;
		}
		else num = num * 10 + (str[i] - '0');
	}
	
	cout << result + num;
	return 0;
}

코드 설명

 c의 경우 ctpye.h, c++의 경우에는 cctype 헤더파일을 사용한다. (isdigit()를 사용하기 때문이다.)

문장의 길이와 문장을 입력받는다. 

 

반복문을 돌면서 str[i]가 숫자가 아닌 경우(==문자)에는 숫자를 결과를 더해주고 0을 대입해서 초기화를 해준다. 

숫자의 경우에는 num = num*10 + (str[i]-'0')을 한다. 10을 곱하는 것은 자릿수가 증가함을 뜻하고, 현재 str[i]가 문자이기에 '0'을 빼준 다음에 그 숫자를 더해준다. 

 

문장이 숫자로 끝났을 경우에는 반복문에서 마지막 피연산자가 더해지지 않았다. 그래서 결과에 num을 더한 값을 출력하고 프로그램을 종료한다. 

느낀 점

문제 보자마자 코드를 바로 작성해서 냈는데 두 번이나 틀렸다...

내가 코드에서 고려하지 않은 점은 두 가지였다. 계산 과정에서 결과가 int의 범위를 넘을 수 있는데 아무 생각 없이 int형으로 결과를 저장하는 변수를 선언했다. 아래 질의응답을 보고 result를 저장하는 변수를 long long형으로 선언했다.

https://www.acmicpc.net/board/view/2342

 

글 읽기 - 히든넘버 질문입니다

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

 

이제 다했다고 생각했는데 또 틀렸다. 두 번째로 고려하지 않았던 것은 문장이 문자로 끝나지 않는 경우. 나는 부호가 등장했을 때 값을 더하도록 코드를 썼기에 만약 문장의 마지막이 숫자였다면 숫자는 더해지지 않고 끝난다. 그래서 이 경우를 고려하기 위해 result = sum을 반복문 이후에 작성했다. (문자로 끝나면 sum = 0이기 때문에 아무 문제가 되지 않는다.)

https://www.acmicpc.net/board/view/75665

 

글 읽기 - 히든넘버 질문

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

 

자꾸 특정한 경우를 고려하지 않는다.. 보자마자 코드를 쓰고 내는 편인데 쓴 코드를 좀 더 고민해보고, 고려하지 않은 것은 없는지 확인해야한다.