728x90
반응형
문제 풀기 전 생각 :
/*
알고리즘 라이브러리에 있는 소트 함수를 사용한다.
소트 조건은 따로 함수를 만들어 지정한다.
*/
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <string>
using namespace std;
bool comp(string s1,string s2){
int n1=0,n2=0;
if(s1.length() == s2.length() ){
for(int i=0 ; i<s1.length() ; i++){
if( isdigit(s1[i]) != 0) n1 += s1[i]-'0';
if( isdigit(s2[i]) != 0) n2 += s2[i]-'0';
}
if(n1 == n2){
return s1 < s2;
}
else return n1 < n2;
}
return s1.length() < s2.length();
}
int main() {
int n;
cin >> n;
string tmp[n];
for(int i=0 ; i<n ; i++){
cin >> tmp[i];
}
sort(tmp,tmp+n ,comp);
for(int i=0 ; i<n ; i++){
cout << tmp[i] << endl;
}
return 0;
}
https://www.acmicpc.net/problem/1431
풀 때 어려웠던 점 또는 느낀점 :
소트 함수에 내가 원하는 조건을 넣는법을 배웠다.
좋은 도구다 후후.
개선방안 :
#include <stdio.h>
#include <string>
#include <algorithm>
using namespace std;
class soya
{
public:
int length, sum;
string name;
};
class cmp
{
public:
bool operator()(const soya& u, const soya& v)
{
if (u.length < v.length)
return 1;
else if (u.length == v.length)
{
if (u.sum < v.sum)
return 1;
else if (u.sum == v.sum)
{
if (u.name < v.name)
return 1;
else return 0;
}
else return 0;
}
else return 0;
}
};
soya a[1010];
int main()
{
int n;
scanf("%d\n", &n);
int i;
for (i = 0; i < n; i++)
{
char x[60];
scanf("%s\n", x);
a[i].name = x;
a[i].length = a[i].name.length();
a[i].sum = 0;
for (int j = 0; j < a[i].length; j++)
{
if (x[j] >= '0' && x[j] <= '9')
a[i].sum += x[j] - '0';
}
}
sort(a, a + n, cmp());
for (i = 0; i < n; i++)
{
printf("%s\n", a[i].name.c_str());
}
return 0;
}
내 코드에서는 comp() 함수 안에서
길이와 숫자의 합을 구하는 작업을 했지만
위의 코드는 그런 작업들이 모두 완료된 후에 sort() 함수를 사용한 것 같다.
728x90
반응형
'Problem Solving' 카테고리의 다른 글
[C++] [백준 10814] 나이순 정렬 (0) | 2021.07.27 |
---|---|
[C++] [LeetCode 1047] Remove All Adjacent Duplicates In String (0) | 2021.07.27 |
[C++] [백준 10867] 중복 빼고 정렬하기 (0) | 2021.07.26 |
[C++] [LeetCode 234] Palindrome Linked List (0) | 2021.07.26 |
[C++] [11866] 요세푸스 문제 0 (0) | 2021.07.25 |
댓글