되면한다
백준 1431. 시리얼 번호 본문
https://www.acmicpc.net/problem/1431
간단한 정렬 문제인데, 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';
}
}
'코딩테스트준비 > 다시볼문제' 카테고리의 다른 글
백준 14888. 연산자 끼워넣기(순서 상관없는 순열) (0) | 2023.07.07 |
---|---|
백준 2910. 빈도 정렬 (정렬) (0) | 2023.07.06 |
백준 13335. 트럭 (구현) (0) | 2023.07.05 |
백준 20166. 문자열 지옥에 빠진 호석 (해시) (0) | 2023.07.01 |
백준 12100. 2048 (Easy) (0) | 2023.07.01 |
Comments