구현, 문자열, 파싱
최근 입사를 하게 되면서 상당히 바쁜 시간들이 이어지고 있다. 회사에 있다는 것 자체로도 부담을 느끼는 신입이기 때문에.. 한동안은 적응에 바쁠 것 같다! 그래도 꾸준히 여러 이야기들을 적으려고 기록하고 있어서 조만간 이야길 풀어낼 수 있으리라 본다.
최근에 C에 대해서 학습할 수 있는 좋은 기회를 얻게 되었고, 가끔 Python이나 Java로 시간초과의 벽을 만날 때마다 아쉬운 점이 있어 이번 기회에 C++를 통해 문제 풀이를 진행해보고자 했다.
얼마 되지 않는 동안 써본 경험상 구현에서 많은 부분이 손이 많이 가지만 그걸 속도가 보상한다는 느낌을 꽤 받는다. 숙달된다면 빠른 속도라는 장점만 가져갈 수 있을지...? 기대가 된다.
- vector: 동적 배열 구조, 배열과 유사하지만 크기의 유동적인 변경이 가능하며 메모리 할당이 자동이라는 큰 장점이 있다!
- npos: no position, 유효하지 않은 위치일 때를 체크하기 위한 인덱스 value
- stringstream: 문자열을 스트림으로 다루기 위한 장치, 입출력과 같은 방식으로 다룰 수 있도록 하며 파싱에 자주 사용됨
기본적인 로직은 페이지 수 제한 전 범위를 커버할 수 있는 bool 배열을 만든 뒤, 들어온 페이지 범위를 모두 체크하고 마지막에 카운팅한 값을 출력하면 된다.
다만, 문제에서 제시한 숫자 범위가 int를 넘어선 값으로 주어질 수 있어 그걸 컨트롤하기 위한 변수 설정이 필요하고, 범위가 역순으로 주어질 경우 체크하지 않는다는 예외항들에 대해서도 주목할 필요가 있다.
이런 과정을 파이썬으로 해결할 때는 상당히 편했지만 C++로 하려니 코드가 엄청 길어지게 되었다..
// 페이지 세기
#include <iostream>
#include <vector>
#include <sstream>
using namespace std;
int main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int total_page, seperator, start, end, result;
string temp, each_range;
vector<string> line_info;
vector<bool> print_info;
vector<int> result_vector;
while (true)
{
cin >> total_page;
if (!total_page)
break ;
else
{
print_info.assign(1001, false);
cin.ignore();
getline(cin, temp);
stringstream range_stream(temp);
while (getline(range_stream, each_range, ','))
{
if (each_range.find('-') == string::npos)
{
if (each_range.length() < 5 && stoi(each_range) <= 1000)
print_info[stoi(each_range)] = true;
}
else
{
seperator = each_range.find('-');
if (each_range.substr(0, seperator).length() < 5
&& stoi(each_range.substr(0, seperator)) <= 1000)
start = stoi(each_range.substr(0, seperator));
else
start = 1001;
if (each_range.substr(seperator + 1, each_range.size()).length() < 5
&& stoi(each_range.substr(seperator + 1, each_range.size())) <= 1000)
end = stoi(each_range.substr(seperator + 1, each_range.size()));
else
end = 1001;
if (start <= end)
{
for (int i = start; i <= end; i++)
{
if (i <= total_page)
print_info[i] = true;
}
}
}
}
result = 0;
for (int i = 1; i <= total_page; i++)
{
if (print_info[i])
result++;
}
result_vector.push_back(result);
}
}
for (int i = 0; i < (int) result_vector.size(); i++)
cout << result_vector[i] << endl;
return (0);
}