728x90

🏆 목차.

  1. 문제
  2. 코드
  3. 풀이

 

🛒 문제

 

백준-1431번-시리얼번호
백준 1431번 시리얼번호

 

🎨 코드

 

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

int sumLength(string str)
{
    int result = 0;
    for (char ch : str)
    {
        if (ch >= '0' && ch <= '9')
            result += ch - '0';
    }
    return result;
}
bool compare(string a, string b)
{
    if (a.length() < b.length()) return 1;
    else if (a.length() > b.length()) return 0;
    else
    {
        int sumA = sumLength(a);
        int sumB = sumLength(b);

        if (sumA != sumB) return sumA < sumB;
        else return a < b;

    }
}
int main()
{
    vector<string> vec;

    int n;
    cin >> n;

    for (int i = 0; i < n; i++)
    {
        string str;
        cin >> str;
        vec.push_back(str);
    }

    sort(vec.begin(), vec.end(), compare);

    for (auto au : vec)
    {
        cout << au << "\n";
    }
}

 

🎯 풀이

 

이번 문제도 sort 함수를 사용해 간단하게 해결이 가능합니다.

 

문제에서 제시하는 조건은 3가지입니다.

1. A와 B의 길이가 다르면, 짧은 것이 먼저 온다.

    if (a.length() < b.length()) return 1;
    else if (a.length() > b.length()) return 0;

a의 길이가 짧으면 먼저 오게 했습니다.

 

2. 만약 서로 길이가 같다면, A의 모든 자릿수의 합과 B의 모든 자리수의 합을 비교해서 작은 합을 가지는 것이 먼저 온다(숫자인 것만 더한다)

int sumLength(string str)
{
    int result = 0;
    for (char ch : str)
    {
        if (ch >= '0' && ch <= '9')
            result += ch - '0';
    }
    return result;
}

숫자인 것만 더한다고 했으니 조건문을 통해서 string에서 숫자만 더하도록 했습니다.

그렇게 나온 자릿수의 합이 같지 않다면 작은 것이 먼저 오도록 했고,

그게 아니라면 같다는 뜻으로 사전순으로 비교하게 했습니다.

 

참고로 return a <b와 같이 작성하면 자동으로 사전순으로 비교할 수 있습니다.

   int sumA = sumLength(a);
   int sumB = sumLength(b);

   if (sumA != sumB) return sumA < sumB;
   else return a < b;

 

728x90

+ Recent posts