백준 10822 - 더하기

1 minute read

문제링크

문제 접근

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