백준 2870 수학 숙제 ⭕

CJB_ny·2023년 1월 17일
0

백준

목록 보기
54/104
post-thumbnail

수학 숙제

음 일단 조금은 알겠는데 시간 넘겨서 강의 들으러 옴.

아스키 코드값으로 0~9사이의 값인지 아닌지 판별해서 어쩌구 할려고 했는데 생각보다 많이 까다롭다.

분석

범위 분석

이 문제는 int, long long 안된다는것을 바로 인지를 하고 string을 사용해주어야한다.

또한 일단 문제에서 입력받는 문자열은 소문자랑 숫자밖에 없다고 했는데,

지금 나처럼

48 <= s[j] && s[j] <= 57;

이런식으로 할 게 아니라 그냥 65보다 작다면으로 수정해버리면 더 간결해진다. (문제에서 정했으니까)

go 함수

또한 go함수를 보면은

이런식으로 while 뒤에if문 하나 더 있는데 있는 이유는

모든 숫자가 '0000'이럴 경우에 '0'이 나와야 하기 때문에 이런식으로 변경함.

sort하는 부분 ❗

정수는 오름차순으로 정렬하면 그냥 정렬 잘 된다.

하지만 문자열을 기반으로 정렬을 하게되면은 아스키 코드 값을 기준으로 정렬한다.(ㅇㅇ 그렇지)

"20", "123" 을 비교한다고 했을 때
"20"의 '2'가 "123"의 '1'보다 아스키 코드 값이 크기 때문에

오름차순으로 장렬하면 "123"이 제일 앞으로 간다.
.
atoi사용하던가 cmp같은 함수 만들어서 사용하든가

질문 ❓

내 코드

#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
#define endl "\n"

int n, ncnt;
vector<int> v;
string s;

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> n;

	for (int i = 0; i < n; ++i)
	{
		cin >> s;
		int start = 0, end = 0, ncnt = 0;
		for (int j = 0; j < s.size(); ++j)
		{
			if (48 <= s[j] && s[j] <= 57)
			{
				++ncnt;
				if (ncnt == 1) start = j;
				if (j == s.size() - 1 && ncnt != 0) 
					goto el;
			}
			else
			{
				el:
				if (ncnt != 0)
				{
					end = j; ncnt = 0;
					string c = s.substr(start, end);
					reverse(c.begin(), c.end());
					for (int k = 0; k < c.size(); ++k)
					{
						if (c[k] == 48)
						{
							c = c.substr(0, k);
							reverse(c.begin(), c.end());
						}
					}
					v.push_back(atoi(c.c_str()));
				}
			}			
		}

		int a = 10;
	}	
	return 0;
}

cpp 코드

#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
#define endl "\n"

int n;
vector<string> v;
string s, ret;

void go()
{
	while (1)
	{
		if (ret.size() && ret.front() == '0') ret.erase(ret.begin());
		else break;
	}
	if (ret.size() == 0) ret = '0';
	v.push_back(ret);
	ret = "";
}

bool cmp(string a, string b)
{
	if (a.size() == b.size()) return a < b;
	return a.size() < b.size();
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> n;
	for (int i = 0; i < n; ++i)
	{
		cin >> s;
		ret = "";
		for (int j = 0; j < s.size(); ++j)
		{
			if (s[j] < 65) ret += s[j];
			else if (ret.size()) go();
		}
		if (ret.size()) go();
	}
	sort(v.begin(), v.end(), cmp);
	for (string i : v) cout << i << endl;

	return 0;
}
profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글