-
[Baekjoon(백준)][2870번] 수학숙제(C++)2024년 01월 30일
- 유니얼
-
작성자
-
2024.01.30.:56
728x90안녕하세요! 오늘은 코딩테스트 문제 중 하나인 "수학숙제" 문제를 해결하는 방법에 대해 설명하려고 합니다. 문자열에 포함된 숫자들을 찾아서 비내림차순(같거나 큰 순서)으로 출력해야 합니다. 문제를 해결하는 과정과 코드를 자세히 알아보겠습니다.
문제링크:
https://www.acmicpc.net/problem/2870
문제 개요
"수학숙제" 문제에서는 문자열에 포함된 숫자들을 찾아서 비내림차순(같거나 큰 순서)으로 출력해야 합니다. 문자열은 알파벳 소문자와 숫자로 이루어져 있으며, 알파벳 사이에 있는 숫자들을 추출하여 정렬하는 것이 주요 과제입니다.
해결 방법
문자열을 순회하면서 숫자가 나오면 이를 추출하고, 숫자가 아닌 문자가 나올 때까지 계속 추출합니다. 추출된 숫자 앞에 있는 불필요한 0을 제거하고, 결과를 벡터에 저장합니다. 모든 문자열을 처리한 후에는 벡터를 정렬하여 숫자들을 출력합니다.
코드 구현
#include <iostream> #include <vector> #include <queue> #include <algorithm> using namespace std; int n; // 숫자의 크기를 비교하는 함수. 길이가 같으면 사전 순으로 비교 bool com(string a, string b) { if (a.size() == b.size()) return a < b; return a.size() < b.size(); } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); vector<string> ret; cin >> n; while (n--) { string str; cin >> str; queue<char> q; for (int i = 0; i < str.size(); i++) { if (isalpha(str[i])) { if (!q.empty()) { string numStr = ""; while (!q.empty()) { numStr += q.front(); q.pop(); } while (numStr.size() >= 2 && numStr[0] == '0') { numStr.erase(numStr.begin()); } ret.push_back(numStr); } } else { q.push(str[i]); } } if (!q.empty()) { string numStr = ""; while (!q.empty()) { numStr += q.front(); q.pop(); } while (numStr.size() >= 2 && numStr[0] == '0') { numStr.erase(numStr.begin()); } ret.push_back(numStr); } } sort(ret.begin(), ret.end(), com); for (auto &num : ret) { cout << num << "\n"; } }
코드 설명
이 코드는 주어진 문자열에서 숫자를 추출하여 정렬하는 과정을 구현합니다. queue를 사용하여 문자열을 순회하면서 숫자를 추출하고, 알파벳이 나올 때까지 또는 문자열의 끝에 도달할 때까지 계속합니다. 추출된 숫자에서 불필요한 선행 0을 제거하고, 결과를 벡터에 저장합니다. 모든 처리가 끝나면 벡터를 정렬하여 결과를 출력합니다.
결론
"수학숙제" 문제는 문자열 처리와 숫자 추출, 그리고 정렬을 사용하여 해결할 수 있는 문제입니다. 문자와 숫자를 구분하고, 추출된 숫자에서 불필요한 부분을 제거하는 것이 중요합니다.
반응형다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드
받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이
감지되어도 모달 창이 표시되지 않습니다.)