https://www.acmicpc.net/problem/2870
시간 제한 | 메모리 제한 | solved.ac 티어 |
1초 | 128MB | 실버 4 |
문제
상근이는 수학시간에 딴 짓을 하다가 선생님께 걸렸다. 선생님은 상근이에게 이번 주말동안 반성하라며 엄청난 숙제를 내주었다.
선생님이 상근이에게 준 종이에는 숫자와 알파벳 소문자로 되어있는 글자가 N줄있다. 상근이는 여기서 숫자를 모두 찾은 뒤, 이 숫자를 비내림차순으로 정리해야한다. 숫자의 앞에 0이 있는 경우에는 정리하면서 생략할 수 있다.
글자를 살펴보다가 숫자가 나오는 경우에는, 가능한 가장 큰 숫자를 찾아야 한다. 즉, 모든 숫자의 앞과 뒤에 문자가 있거나, 줄의 시작 또는 끝이어야 한다.
예를 들어, 01a2b3456cde478에서 숫자를 찾으면 1, 2, 3456, 478이다.
선생님이 준 종이의 내용이 주어졌을 때, 상근이의 숙제를 대신하는 프로그램을 작성하시오.
입력
첫째 줄에 종이의 줄의 개수 N이 주어진다. (1 ≤ N ≤ 100)
다음 N개의 줄에는 각 줄의 내용이 주어진다. 각 줄은 최대 100글자이고, 항상 알파벳 소문자와 숫자로만 이루어져 있다.
출력
종이에서 찾은 숫자의 개수를 M이라고 하면, 출력은 M줄로 이루어져야 한다. 각 줄에는 종이에서 찾은 숫자를 하나씩 출력해야 한다. 이때, 비내림차순으로 출력해야 한다. 비내림차순은 내림차순의 반대인 경우인데, 다음 수가 앞의 수보다 크거나 같은 경우를 말한다.
이 문제의 연장문제같은 느낌이다. 알파벳과 문자가 혼재된 문자열에서 숫자만을 걸러내야 하는 문제이다. 다만, 이 문제의 한 줄은 최대 100글자가 들어오고, 이때 이 문자열이 모두 숫자로 이루어져 있다면, C++에서는 __int128형(__int128형에 관한 간단한 설명 + 활용한 풀이: https://codejin.tistory.com/149)으로도 담을 수 없다. log(2^127 - 1)이 38보다 조금 큰데, 이는 __int128형의 최댓값이 38자리라는 뜻이다. 하지만 이는 최대 100자리의 정수에 비해서는 턱없이 부족하다. 따라서 이 문제는 정수로 접근하는 것이 아닌 문자열로 접근해야 한다.
입력받은 문자열에서 숫자만 걸러내서 문자열로 저장하고, 이를 벡터에 push한 후에, 정렬하면 된다.
정렬할 때, 정렬함수를 따로 만들어야 하는데, 문자열을 숫자 비교하는 것처럼 비교해야 하기 때문에, 비교함수를 작성한다.
비교함수는 문자열의 길이가 다르면, 문자열의 길이를 비교하고, 길이가 같다면 문자열을 비교한다.
#include <bits/stdc++.h>
using namespace std;
bool comp(const string& str1, const string& str2){
if(str1.size() == str2.size()) return str1 < str2;
else return str1.size() < str2.size();
}
int main () {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int t;
vector<string> v;
string str, num;
cin >> t;
cin.ignore();
while(t--) {
cin >> str;
for(const auto& token : str) {
if(isdigit(token)) {
num += token;
}
else if(!num.empty()){
while (num.length() >= 2 && num[0] == '0') {
num.erase(0, 1);
}
v.push_back(num);
num = "";
}
}
if(!num.empty()) {
while (num.length() >= 2 && num[0] == '0') {
num.erase(0, 1);
}
v.push_back(num);
num = "";
}
}
sort(v.begin(), v.end(), comp);
for(const auto& x : v) cout << x << '\n';
}
'coding_test > BAEKJOON' 카테고리의 다른 글
백준 2343번 C++ 풀이 (0) | 2022.01.26 |
---|---|
백준 4796번 C++ 풀이 (0) | 2022.01.26 |
백준 11819번 C++ 풀이 (0) | 2022.01.22 |
백준 5585번 C++ 풀이 (0) | 2022.01.21 |
백준 1018번 C++ 풀이 (0) | 2022.01.21 |