본문 바로가기
알고리즘/백준-실버

백준 2870번 수학숙제(overflow주의)(C++)

by 뜨거운 개발자 2023. 1. 6.

문제

정답 코드

#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;

void s_toi(string s,vector <string> &arr)
{
	char ar[100];
	int aridx=0;
	int size = s.size();
	long long  ret =0;
	int flag = 0;
	for (int i=0;i <size;i++)
	{
		if ('0'<=s[i] && s[i] <='9')
		{
			flag =1;
			if (aridx == 0 && i  != size - 1 &&  s[i] == '0' )
			{
				continue;
			}
			ar[aridx] = s[i];
			aridx++;
			if (i == size -1)
			{
				if (flag == 1 && aridx == 0)
				{
					ar[aridx] ='0';
					aridx ++;
				}
				ar[aridx] = '\0';
				arr.push_back(ar);
			}
		}
		else if (flag == 1)
		{
			if (flag == 1 && aridx == 0)
			{
					ar[aridx] ='0';
					aridx ++;
			}
			ar[aridx] = '\0';
			arr.push_back(ar);
			aridx = 0;
			flag =0;
		}
	}
}

int cmp(string a1, string a2)
{
	if (a1.size() > a2.size())
		return (0);
	else if (a1.size() < a2.size())
		return (1);
	for (int i=0; i < a1.size();i++)
	{
		if (a1[i] != a2[i])
		{
			return(a1[i] < a2[i]);
		}
	}
	return (1);
}
int main()
{
	ios:: sync_with_stdio(0);
	cin.tie(0);
	int n;
	cin >> n;
	vector <string> arr;
	for (int i=0;i < n; i++)
	{
		string s;
		cin >> s;
		s_toi(s,arr);
	}
	sort (arr.begin(),arr.end(),cmp);
	for (auto it : arr)
	{
		cout << it << "\n";
	}
}

문제 풀이의 흐름

  • 입력
  • 문자를 숫자만 파싱받아서 vector에 넣어주고
  • 그걸 정렬하는데
  • 정렬 비교 함수를 직접 만들어서 사용

주의 할 점

  • 이 문제는 쉽게 보면 쉬운데 문자열로 접근을 해야한다 왜냐면 엄청나게 큰 수가 오기때문이다.
  • 문자열 비교는 살짝 더럽지만 최대한 깔끔하게 하려고 했다.

반성 및 고찰

틀린코드

#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;

void s_toi(string s,vector <long long> &arr)
{
	int size = s.size();
	long long  ret =0;
	int flag = 0;
	for (int i=0;i <size;i++)
	{
		if ('0'<=s[i] && s[i] <='9')
		{
			flag =1;
			ret = ret *10 + s[i] -'0';
			if (i == size -1)
				arr.push_back(ret);
		}
		else if (flag == 1)
		{
			arr.push_back(ret);
			ret = 0;
			flag =0;
		}
	}
}
int main()
{
	// ios:: sync_with_stdio(0);
	// cin.tie(0);
	int n;
	cin >> n;
	vector <long long> arr;
	for (int i=0;i < n; i++)
	{
		string s;
		cin >> s;
		s_toi(s,arr);
	}
	sort (arr.begin(),arr.end());
	for (auto it : arr)
	{
		cout << it << "\n";
	}
}

이 문제는 숫자가 엄청나게 크게 들어오는 케이스가 존재한다.


Uploaded by N2T

728x90