본문 바로가기

백준

백준2870 - 수학숙제

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