되면한다

백준 1431. 시리얼 번호 본문

코딩테스트준비/다시볼문제

백준 1431. 시리얼 번호

haeullee 2023. 7. 6. 11:39

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

 

1431번: 시리얼 번호

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

www.acmicpc.net

간단한 정렬 문제인데, sort함수를 커스텀? 하는게 헷갈려서 정리했다. 

사진은 https://www.youtube.com/watch?v=dq5t1woLJMw&list=PLtqbFd2VIQv4O6D6l9HcD732hdrnYb6CY&index=16 

에서 캡처했다. 

 

1. 아래 사진에서 cmp 함수에 따르면, a가 b의 앞에 와야하는 경우는 b가 a보다 큰경우이다. 따라서 오름차순 정렬.

cf) 어떤 경우에 true를 반환할지 생각하며 return 설정한다. 

2. 아래 사진의 1번과 같은 상황을 조심해야한다. 두 값이 같을 때는 false를 반환해야하는데, 아닌 경우 런타임에러가 발생할 수 있다. 

 

3. 코드 

#include <bits/stdc++.h>
using namespace std;
string arr[52];

bool comp(const string& a, const string& b)
{
    if(a.length() != b.length()) return a.length() < b.length(); // b의 길이가 큰 경우 true(뒤로 감)
    else
    {
        int asum = 0;
        int bsum = 0;
        for(int i = 0; i < a.length(); i++)
        {
            if(a[i] >= '0' && a[i] <= '9') asum += (a[i] - '0'); //or if(isdigit(a[i]))
        }

        for(int i = 0; i < b.length(); i++)
        {
            if(b[i] >= '0' && b[i] <= '9') bsum += (b[i] - '0');
        }

        if(asum != bsum) return asum < bsum; // bsum의 합이 큰 경우 true(뒤로 감) 
        else return a < b; //사전순
    }
    
}

int main(void)
{

    int n;
    cin >> n;

    for(int i = 0; i < n; i++)
    {
        cin >> arr[i];
    }

    sort(arr, arr+n, comp);

    for(int i = 0; i < n; i++)
    {
        cout << arr[i] << '\n';
    }

}
Comments