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

SHark·2023년 4월 27일
0

BOJ

목록 보기
45/59

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

문제

다솜이는 기타를 많이 가지고 있다. 그리고 각각의 기타는 모두 다른 시리얼 번호를 가지고 있다. 다솜이는 기타를 빨리 찾아서 빨리 사람들에게 연주해주기 위해서 기타를 시리얼 번호 순서대로 정렬하고자 한다.

모든 시리얼 번호는 알파벳 대문자 (A-Z)와 숫자 (0-9)로 이루어져 있다.

조건

시리얼번호 A가 시리얼번호 B의 앞에 오는 경우는 다음과 같다.

  • A와 B의 길이가 다르면, 짧은 것이 먼저 온다.
  • 만약 서로 길이가 같다면, A의 모든 자리수의 합과 B의 모든 자리수의 합을 비교해서 작은 합을 가지는 것이 먼저온다. (숫자인 것만 더한다)
  • 만약 1,2번 둘 조건으로도 비교할 수 없으면, 사전순으로 비교한다. 숫자가 알파벳보다 사전순으로 작다.

풀이

Compare 함수를 이용해보는 문제이다. 1,2,3번째 조건을 차례차례 적어내려가면 된다.
Compare 함수에서는 A가 B보다 앞에 있어야하면 true를 아니라면 false를 리턴하게 만들면된다.

#include <bits/stdc++.h>
#define fastio cin.tie(0)->sync_with_stdio(0)

using namespace std;

int N;

vector<string> arr;

int cal_digit(string s)
{
  int total = 0;
  for (int i = 0; i < s.size(); i++)
    if (s[i] >= '0' && s[i] <= '9')
      total += s[i] - '0';
  return total;
}

bool comp(string a, string b)
{
  if (!(a.size() == b.size()))
    return a.size() < b.size();
  // 길이가 같은 경우
  int total_A = cal_digit(a);
  int total_B = cal_digit(b);
  if (!(total_A == total_B))
    return total_A < total_B;
  return a < b;
}

int main()
{
  fastio;
  cin >> N;
  string tmp;
  for (int i = 0; i < N; i++)
  {
    cin >> tmp;
    arr.push_back(tmp);
  }
  sort(arr.begin(), arr.end(), comp);
  for (int i = 0; i < N; i++)
  {
    cout << arr[i] << '\n';
  }
  return 0;
}

0개의 댓글