[BOJ 4821, CPP] 페이지 세기

TraceofLight·2023년 8월 26일
0

ProblemSolving

목록 보기
20/21
post-thumbnail

문제 링크

BOJ 4821

분류

구현, 문자열, 파싱

들어가며

최근 입사를 하게 되면서 상당히 바쁜 시간들이 이어지고 있다. 회사에 있다는 것 자체로도 부담을 느끼는 신입이기 때문에.. 한동안은 적응에 바쁠 것 같다! 그래도 꾸준히 여러 이야기들을 적으려고 기록하고 있어서 조만간 이야길 풀어낼 수 있으리라 본다.

최근에 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);
}
profile
24시간은 부족한 게 맞다

0개의 댓글