PS/문자열 알고리즘[String]

백준 1431 시리얼 번호(c++)

SeungbeomKim 2022. 7. 8. 16:12

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

 

1431번: 시리얼 번호

첫째 줄에 기타의 개수 N이 주어진다. N은 50보다 작거나 같다. 둘째 줄부터 N개의 줄에 시리얼 번호가 하나씩 주어진다. 시리얼 번호의 길이는 최대 50이고, 알파벳 대문자 또는 숫자로만 이루어

www.acmicpc.net

<코드>

#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <cstdio>
using namespace std;
bool cmp(string s1,string s2)
{
	int sums1 = 0;
	int sums2 = 0;
	if(s1.size()==s2.size())
	{
		for(int i=0;i<s1.size();i++)
		{
			if(s1[i]>='0' && s1[i]<='9')
			{
				sums1 += (s1[i] - '0');
			}
			if(s2[i]>='0' && s2[i]<='9')
			{
				sums2 += (s2[i] - '0');
			}
		}
		if(sums2==sums1){
			return s1<s2;
		}
		else{
			return sums1<sums2;
		}
	}
	else return s1.size()<s2.size();
}
int main()
{
	int n;
	cin>>n;
	string str;
	vector<string>v;
	for(int i=0;i<n;i++)
	{
		cin>>str;
		v.push_back(str);
	}
	sort(v.begin(),v.end(),cmp);
	for(int i=0;i<n;i++)
	{
		cout<<v[i]<<'\n';
	}
	
}

<풀이과정>

우선적으로 길이가 짧은 것은 가장 먼저 출력해주고, 길이가 같다면 각 자리의 숫자의 합(알파벳은 제외시켜줘야함 !)이 작은 것을 먼저 출력해주는 cmp함수를 만들어주고, 정렬시켜줄때 함수의 마지막 인자에 cmp를 넣어주면 된다. 여기에서 문자를 숫자로 변환시켜주기 위해 (s[i]-'0')가 사용되었다.