본문 바로가기
Problem Solving

[C++] [백준 1431] 시리얼 번호

by tls1107 2021. 7. 26.
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
반응형

댓글