https://www.acmicpc.net/problem/2870
2870번: 수학숙제
문제 상근이는 수학시간에 딴 짓을 하다가 선생님께 걸렸다. 선생님은 상근이에게 이번 주말동안 반성하라며 엄청난 숙제를 내주었다. 선생님이 상근이에게 준 종이에는 숫자와 알파벳 소문자로 되어있는 글자가 N줄있다. 상근이는 여기서 숫자를 모두 찾은 뒤, 이 숫자를 비내림차순으로 정리해야한다. 숫자의 앞에 0이 있는 경우에는 정리하면서 생략할 수 있다. 글자를 살펴보다가 숫자가 나오는 경우에는, 가능한 가장 큰 숫자를 찾아야 한다. 즉, 모든 숫자의 앞과 뒤에
www.acmicpc.net
생각보다 조건이 까다로웠던 문제다.
파이썬으로 처리하면 간단했을 것 같다.
맨앞에 0처리를 해줘야 하였고 0으로만 이루어진 문자열은 0을 하나만 남긴 채로 저장해야 되는 조건이 있었다.
맨 마지막 문자를 만났을 때 숫자가 존재한다면 숫자를 넣어주어야 하는 생각도 해야 했다.
내림차순의 반대라 해서 오름차순 sort를 썼다.
벡터와 스트링을 이용하였고 실수 한 점은 비교함수의 매개변수를 처음에 참조형으로 선언해주지 않은 것이다.
처음으로 참조를 문제에 적용해 본 것 같다.
참조는 좋다.
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
//참조형으로 매개변수를 선언하여 원본의 값을 바꾼다.
void Erase(string& s) {
while (1) {
if (s.size() == 1 && s == "0") { //숫자의 길이가 1이고 그 숫자가 0이면 실제로 넣어줘야 하는 숫자이다.
break;//탈출
}
if (s[0] == '0') { //맨 앞에 숫자가 0이면
s.erase(0, 1); //맨 앞에 숫자를 지운다.
}
else { //아니면
break; //탈출
}
}
}
//문자열의 길이를 비교하는 함수
bool compare(string a, string b) {
if (a.size() == b.size()) { //문자열의 길이가 같으면
int sz = a.size();
for (unsigned int i = 0; i < sz; i++) { //문자열의 길이만큼 반복
if (a[i] == b[i]) { //문자가 서로 같으면
continue; //넘어가고
}
else { //다르면
return a[i] < b[i]; //둘 중에 누가 더 큰지 비교한다.
}
}
}
return a.size() < b.size(); //문자열의 길이를 비교하여 반환
}
int main() {
int n; //문자열의 갯수
cin >> n;
vector<string> v; //숫자를 담을 공간
while (n--) {
string s;
string check;
cin >> s;
for (unsigned int i = 0; i < s.size(); i++) {
if ('0' <= s[i] && s[i] <= '9') { //현재 문자가 0 ~ 9사이의 수면
check = check + s[i];
}
else {
if (check.size() == 0) { //문자를 만났을 때 숫자가 없는 빈 스트링이면
continue; //건너뛴다.
}
else { //문자를 만났을 때 숫자가 있는 스트링이면
if (check != "0") { //숫자를 담은 스트링이 0이 아니면
Erase(check); //함수 이용
}
v.push_back(check); //벡터에 삽입한다.
check.clear(); //빈 공간으로 초기화
}
}
if (i == s.size() - 1) { //마지막 문자를 만나면
if (check.size() != 0) { //숫자를 담을 스트링의 크기가 0이 아니면
if (check != "0") { //숫자를 담은 스트링이 0이 아니면
Erase(check); //함수 이용
}
v.push_back(check); //벡터에 삽입한다.
check.clear(); //빈 공간으로 초기화
}
}
}
}
vector<string>::iterator iter; //vector의 iterator 이용
sort(v.begin(), v.end(),compare); //sort로 정렬하고 기준은 compare함수
for (iter = v.begin(); iter != v.end(); iter++) {
cout << *iter << '\n'; //출력
}
}
'백준' 카테고리의 다른 글
백준5622 - 다이얼 (0) | 2019.06.19 |
---|---|
백준3986 - 좋은단어 (0) | 2019.06.19 |
백준17213 - 과일서리 (0) | 2019.06.19 |
백준11729 - 하노이 탑 이동 순서 (0) | 2019.06.11 |
백준1541 - 잃어버린 괄호 (0) | 2019.06.11 |