문제
상근이는 수학시간에 딴 짓을 하다가 선생님께 걸렸다. 선생님은 상근이에게 이번 주말동안 반성하라며 엄청난 숙제를 내주었다.
선생님이 상근이에게 준 종이에는 숫자와 알파벳 소문자로 되어있는 글자가 N줄있다. 상근이는 여기서 숫자를 모두 찾은 뒤, 이 숫자를 비내림차순으로 정리해야한다. 숫자의 앞에 0이 있는 경우에는 정리하면서 생략할 수 있다.
글자를 살펴보다가 숫자가 나오는 경우에는, 가능한 가장 큰 숫자를 찾아야 한다. 즉, 모든 숫자의 앞과 뒤에 문자가 있거나, 줄의 시작 또는 끝이어야 한다.
예를 들어, 01a2b3456cde478에서 숫자를 찾으면 1, 2, 3456, 478이다.
선생님이 준 종이의 내용이 주어졌을 때, 상근이의 숙제를 대신하는 프로그램을 작성하시오.
입력
첫째 줄에 종이의 줄의 개수 N이 주어진다. (1 ≤ N ≤ 100)
다음 N개의 줄에는 각 줄의 내용이 주어진다. 각 줄은 최대 100글자이고, 항상 알파벳 소문자와 숫자로만 이루어져 있다.
출력
종이에서 찾은 숫자의 개수를 M이라고 하면, 출력은 M줄로 이루어져야 한다. 각 줄에는 종이에서 찾은 숫자를 하나씩 출력해야 한다. 이때, 비내림차순으로 출력해야 한다. 비내림차순은 내림차순의 반대인 경우인데, 다음 수가 앞의 수보다 크거나 같은 경우를 말한다.
구현해야 할 조건
알파벳 소문자를 제외한 애들인 숫자를 넣어주는데, 앞자리 0은 포함하지 않는 조건과 최대 100글자라고 하면 엄청나게 큰 숫자이다. 10의 9승이 1억이니까? 어마어마하다? 그러니까 숫자로 바꿔주지는 못하고, string상황에서 앞자리 0을 제거하는 과정와 0이 나오면 끊어주는 과정을 구현해야한다.. 말을 진짜 못하겠네
string을 사용해야하는 것과, 0이 나오면 끊어주는 구현을 해줘야 한다!
code
#include<iostream>
#include<algorithm>
#define INF 987654321
using namespace std;
int n;
vector<string> v;
string s,ret;
void chk()
{
if(ret.length())
{
while(1)
{
if(ret.length() && ret.front() == '0') // 앞자리 0이면 제거
ret.erase(ret.begin());
else
break;
}
if(ret.size() == 0) // 일단 들어왔는데, 0이라 제거 당했다면
ret = "0";
v.push_back(ret); // vector에 넣어준다.
ret = "";
}
}
bool comp(string a, string b)
{
if(a.size() == b.size()) // string으로 문제를 해결하기 때문에
return a < b;
return a.size() < b.size();
}
int main()
{
cin >> n;
for(int i = 0; i < n; i++)
{
cin >> s;
ret = "";
for(int j = 0; j < s.length(); j++){
if('0' <= s[j] && s[j] <= '9') // 알파벳 소문자를 제외한것 다 넣기
ret += s[j];
else
chk();
}
chk();
}
sort(v.begin(), v.end(), comp);
for(auto s : v)
cout << s << "\n";
return 0;
}
'PS > BaekJoon' 카테고리의 다른 글
[백준/c++] 1325 효율적인 해킹 (0) | 2022.04.05 |
---|---|
[백준/c++] 4949 균형잡힌 세상 (0) | 2022.04.05 |
[백준/c++] 빈도 정렬 (0) | 2022.04.04 |
[백준/c++] 안전 영역 (0) | 2022.04.04 |
[백준/c++] 2559 수열 (0) | 2022.04.02 |