[ BOJ / C++ ] 1431번 시리얼 번호

황승환·2021년 10월 4일
0

C++

목록 보기
59/65

이번 문제는 문자열을 주어진 우선순위에 따라 정렬시켜 해결하는 문제였다. 본인은 C++의 표준 라이브러리 중 sort함수를 사용하였다.

  • sort함수를 사용할 때에 3번째 인자를 비워두면 오름차순으로 정렬된다.
  • 3번째 인자에 들어갈 정렬 기준 함수 compare함수를 정의하였다.
  • 우선적으로 문자열의 길이의 오름차순으로 정렬해준다.
  • 만약 문자열의 길이가 같을 경우에는 문자열 내의 숫자끼리 더한 값의 오름차순으로 정렬을 해야한다. 이 부분에서 생각이 필요했다.
  • 문자열의 문자 하나하나를 int로 보고 0~9사이의 수라면 더하도록 구현하였지만 제대로 작동하지 않았다.
  • 구글링을 하여 문자열에서 숫자를 찾을 때에는 48~57사이에 해당되는 문자가 숫자라는 사실을 알았고 이를 이용하였다.
  • 앞의 두 경우에 해당하지 않으려면 숫자의 합이 같을 때 밖에 없으므로 두 문자열의 숫자 합이 같을 때 사전순으로 정렬하도록 하였다.

C++

#include <iostream>
#include <string>
#include <algorithm>
#define MAX 1001
using namespace std;

int n;
string serial[MAX];

void Input(){
    cin>>n;
    for(int i=0; i<n; i++){
        cin>>serial[i];
    }
}

bool compare(string a, string b){
    if(a.length()<b.length())
        return true;
    else if(a.length()==b.length()){
        int asum=0;
        int bsum=0;
        for(int i=0; i<=a.length(); i++){
            if(a[i]>=48&&a[i]<=57){
                asum+=int(a[i]-'0');
            }
            if(b[i]>=48&&b[i]<=57){
                bsum+=int(b[i]-'0');
            }
        }
        if(asum<bsum)
            return true;
        else if(asum>bsum)
            return false;
        else{
            if(a<b)
                return true;
            return false;
        }
    }
    else{
        return false;
    }
}

void Solution(){
    sort(serial, serial+n, compare);
    for(int i=0; i<n; i++){
        cout<<serial[i]<<endl;
    }
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    Input();
    Solution();
    return 0;
}

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글