예전에 틀렸던 부분 그대로 다시 틀렸다 ... 
 
#include <bits/stdc++.h>
using namespace std;

int n; // 기타 개수
string st;
vector<string> v;

int digit_sum(string &a){ // 문자열 중에 숫자만 뽑아서 합을 리턴
  int sum = 0;
  for(auto num : a) {
    if(isdigit(num)) sum += (num - '0');
  }
  return sum;
}

bool check(string &a, string &b){

  int alen = a.size(), blen = b.size(); // 문자열 길이 
  int asum = digit_sum(a), bsum = digit_sum(b); // 숫자합 

  // 길이가 다르면 길이끼리 비교
  if(alen != blen) return alen < blen;
  // 합이 다르면 합끼리 비교
  if(asum != bsum) return asum < bsum;
  // 사전순
  return a < b;
}

int main(void) {
  ios::sync_with_stdio(0);
  cin.tie(0);

  cin >> n;

  while(n--){
    cin >> st;
    v.push_back(st);
  }
  sort(v.begin(), v.end(), check); // 비교함수로 정렬 
  for(auto s : v) cout << s << '\n';

  return 0;
}
 
문제의 정렬 조건은 3가지다. 
 
첫 째, 문자열 길이 →  size() 를 구해 비교
둘 째, 숫자 합 크기 → 문자를 isdigit() 으로 숫자인지 판별. 리턴은 bool
셋 째, 사전순 → a < b 아스키코드 오름차순이라서 간단.
 

아래는 틀린코드다.
bool check(string &a, string &b){

  int alen = a.size(), blen = b.size();

  if(alen < blen) return alen < blen;
  else if(alen == blen){ // 각각 숫자만 뽑아서 합 비교 
    int asum = 0, bsum = 0;
    for(int i = 0; i < alen; i++){ // 길이가 같으니까 인덱스 똑같이 사용 
      if(isdigit(a[i])) asum += (a[i] - '0');
      if(isdigit(b[i])) bsum += (b[i] - '0');
    }
    return asum < bsum;
  }else{ // 사전순
    return a < b;
  }
}
 
틀린 원인
길이 비교라는게, 길이가 달라야 비교하는 것이다. 
아래 처럼 <  로 조건을 넣으니까 틀렸다. 
[X] if(alen < blen) 
[O] if(alen != blen) 
 
숫자 합 비교도 마찬가지다. “달라야"비교한다. 
[X] if(asum < bsum) 
[O] if(asum != bsum) 
 
728x90

'알고리즘 > 백준' 카테고리의 다른 글

좋은 단어 백준 3986번 c++ (두번째 풀기)  (0) 2022.02.11
Hasing 백준 15829번 c++  (0) 2022.02.11
곱셈 백준 1629번 c++  (0) 2022.02.09
큰 수 A+B 백준 10757번 c++  (0) 2022.02.09
피보나치 수 4 백준 10826번 c++  (0) 2022.02.08

+ Recent posts