주녘공부일지

[백준 2870번 C++] Silver4. 수학숙제 본문

CodingTest/BeakJoon Silver

[백준 2870번 C++] Silver4. 수학숙제

주녘 2024. 12. 8. 17:45

https://www.acmicpc.net/problem/2870

핵심 아이디어 및 정답 코드

- 주어진 문자열 중에 정수들을 찾아내어 오름차순으로 정렬해 출력하는 문제

- 문제에서 최대 100자리를 가진 숫자가 나올 수 있기 때문에 정수형이 아닌 문자열로 받아옴

 - 000 -> 0

 - 001 -> 1

 - 100 -> 100

 

+ 문자열은 길이가 같을 경우 비교하면 더 큰 숫자가 크게 나옴

 

정답 코드

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

vector<string> strVec;

void FindNumStr(string str)
{
    for (int i = 0; i < str.size(); i++)
    {
        if (str[i] == '0')
        {
            bool isZero = true;
            for (int j = i + 1; j < str.size(); j++)
            {
                i = j;
                if (str[j] == '0')
                    continue;

                if ('1' <= str[j] && str[j] <= '9')
                {
                    isZero = false;
                    i--;
                    break;
                }
                break;
            }

            if (isZero)
                strVec.push_back("0");
        }
        else if ('1' <= str[i] && str[i] <= '9')
        {
            int startIndex = i;
            int len = 1;
            for (int j = i + 1; j < str.size(); j++)
            {
                i = j;
                if ('0' <= str[j] && str[j] <= '9')
                    len++;
                else
                    break;
            }

            string temp = str.substr(startIndex, len);
            if(temp.size() > 0)
                strVec.push_back(temp);
        }
    }
}

bool CompareTo(string str1, string str2)
{
    if (str1.size() == str2.size())
        return str1 < str2;

    return str1.size() < str2.size();
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int count;
    cin >> count;

    // 숫자 찾기
    string str;
    for (int i = 0; i < count; i++)
    {
        cin >> str;
        FindNumStr(str);
    }

    // 오름차순 정렬
    sort(strVec.begin(), strVec.end(), CompareTo);

    // 출력
    for (int i = 0; i < strVec.size(); i++)
        cout << strVec[i] << '\n';

    return 0;
}