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
자꾸 특정한 경우를 고려하지 않는다.. 보자마자 코드를 쓰고 내는 편인데 쓴 코드를 좀 더 고민해보고, 고려하지 않은 것은 없는지 확인해야한다.
'PS (C, C++)' 카테고리의 다른 글
[백준/C & C++] 1213 팰린드롬 만들기 (0) | 2023.01.11 |
---|---|
[백준/C & C++] 1158 요세푸스 문제 (0) | 2023.01.08 |
[백준/C & C++] 1541 잃어버린 괄호 (0) | 2022.11.26 |
[백준/C & C++] 1296 팀 이름 정하기 (0) | 2022.11.05 |
[백준/C & C++] 1302 베스트셀러 (0) | 2022.11.05 |