백준 10822 - 더하기
문제링크
문제 접근
C-style
- strtok 함수를 활용
- 구분자와 포인터를 적절히 활용하는 방법으로 관련 개념은 strtok 함수 를 참고
C++
- string 클래스를 이용
- 벡터 컨테이너를 활용하여 구분자의 인덱스를 저장한다.
- stoi 함수의 첫번째 인자로 해당 인덱스의 다음 주소값을 전달하여 문자열을 파싱(parsing)한다.
의사코드(pseudo-code)
C-style
- input a string in a variable, str that is a array of characters
- init char*ptr = strtok(str, ",")
- init sum = 0
- while ptr!=NULL do:
- sum += atoi(ptr)
- ptr = strtok(NULL, ",")
- print "sum"
C++
- input a string in a variable, str
- init vector<int> v
- v.push_back(0)
- for i=0 to str.length()-1 do:
- if str[i]==',' then:
- v.push_back(i)
- init sum = stoi(str)
- for i=1 to v.size()-1 do:
- init idx = v[i]+1
- sum += stoi(&str[idx])
- print "sum"
소스코드 및 분석
전체 코드(C-style)
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char str[101];
scanf("%s", str);
char* ptr = strtok(str, ",");
int sum = 0;
while (ptr != NULL) {
sum += atoi(ptr);
ptr = strtok(NULL, ",");
}
printf("%d\n", sum);
}
전체 코드(C++)
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
string str;
cin >> str;
vector<int> v;
v.push_back(0);
for (int i = 0; i < str.length(); i++)
if (str[i] == ',')
v.push_back(i);
int sum = stoi(str);
for (int i = 1; i < v.size(); i++) {
int idx = v[i] + 1;
sum += stoi(&str[idx]);
}
printf("%d\n", sum);
}
- stoi 함수가 문자열을 숫자로 변환하는 원리를 응용하였다.
- stoi 함수는 첫번째 인자로 받는 문자열의 주소값부터 탐색하여 숫자가 아닌 문자를 만나면 이전까지의 숫자를 정수로 반환하는 함수이다.
- 따라서, 구분자(여기서는 콤마)의 위치를 담는 별도의 컨테이너를 활용하여 해당 위치를 기억하고, 정수로 변환할 때 해당 구분자의 다음문자를 가리키도록 설정했다.
C++ 다른 코드
#include <iostream>
#include <string>
using namespace std;
int main(void)
{
string s;
cin >> s;
string number;
int ans = 0;
for (int i = 0; i <= s.size(); i++) {
char ch = s[i];
if (ch == ',' || ch == NULL) {
ans += stoi(number);
number.clear();
continue;
}
number.push_back(ch);
}
cout << ans << endl;
return 0;
}
Leave a comment