[백준] 2870 수학숙제

0

백준

목록 보기
231/271
post-thumbnail
post-custom-banner

[백준] 2870 수학숙제

틀린 풀이

  • 숫자로 이루어진 문자열을 정수형으로 바꾸어 사용하는 경우,
    알파벳 소문자와 숫자로 이루어진 각 줄이 최대 100글자이기 때문에
    unsigned long long 타입을 사용하더라도 out of range가 발생한다
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

typedef unsigned long long ull;

bool cmp(ull a, ull b) {
	return a < b;
}

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

	int N;
	cin >> N;

	vector<ull> nums;
	while (N--) {
		string input;
		cin >> input;

		string num = "";
		int len = input.length();
		for (int i = 0; i < len; ++i) {
			if (('0' <= input[i]) && (input[i] <= '9')) {
				num += input[i];
			}
			else {
				if (num == "") continue;
				nums.push_back(stoull(num));
				num = "";
			}
		}
		if (num != "") nums.push_back(stoi(num));
	}

	sort(nums.begin(), nums.end(), cmp);
	for (int i = 0; i < nums.size(); ++i) {
		cout << nums[i] << "\n";
	}
	return 0;
}

풀이

  • 숫자로 이루어진 문자열 그대로 저장 & 비교해야 한다

  • string 간의 문자열 비교
    두 문자열이 같은 경우: a.compare(b) == 0
    a가 b보다 사전순으로 앞인 경우: a.compare(b) < 0
    a가 b보다 사전순으로 뒤인 경우: a.compare(b) > 0

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

//문자열 오름차순 정렬 
bool cmp(string a, string b) {
	if (a.length() < b.length()) 
		return true;
	if (a.length() == b.length()) 
		return a.compare(b) < 0;
	return false;
}

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

	int N;
	cin >> N;

	vector<string> nums;
	while (N--) {
		string input;
		cin >> input;

		vector<string> tmp;
		string num = "";
		int len = input.length();
		for (int i = 0; i < len; ++i) {
			if (('0' <= input[i]) && (input[i] <= '9')) {
				num += input[i];
			}
			else {
				if (num == "") continue;
				tmp.push_back(num);
				num = "";
			}
		}
		if (num != "") tmp.push_back(num);


		//숫자 앞에 0이 있는 경우 정리
		for (int i = 0; i < tmp.size(); ++i) {
			string num = tmp[i];
			string newNum = "";

			int len = num.length();
			for (int j = 0; j < len; ++j) {
				if (num[j] == '0') continue;
				else {
                	//num.substr(j): num의 인덱스 j부터 끝까지 문자열로 반환
					newNum = num.substr(j);
					break;
				}
			}
			if (newNum == "") newNum = "0";
			nums.push_back(newNum);
		}
	}

	sort(nums.begin(), nums.end(), cmp);
	for (int i = 0; i < nums.size(); ++i) {
		cout << nums[i] << "\n";
	}
	return 0;
}

📌참고자료

profile
Be able to be vulnerable, in search of truth
post-custom-banner

0개의 댓글