https://www.acmicpc.net/problem/16496
16496번: 큰 수 만들기
첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 리스트에 포함된 수가 주어진다. 수는 공백으로 구분되어져 있고, 1,000,000,000보다 작거나 같은 음이 아닌 정수 이다. 0을 제외한 나
www.acmicpc.net
솔루션
플레티넘 치곤 아이디어를 떠 올리기가 그나마 쉬웠다. (다만 시간이 걱정되었는데, 통과가 됐다!)
처음에는 각 문자열마다 크기를 비교해서 더 큰 값이 나오는 즉시 바로 리턴을 하도록 operator를 작성 했다가.. 질문 게시판에 있는 반례에 걸렸다.
그 다음으로 생각을 한것이
각 문자열을 str +t.str, t.str + str 이렇게 두개를 더하여서 각 문자열끼리 비교하다가 어느 수가 더크다면 바로 리턴을 하도록 하였다.
만약 [0]번째 문자열의 첫 숫자가 '0' 이라면 바로 '0'만 출력하고 종료하도록 하였다.
코드
#include <iostream>
#include <algorithm>
using namespace std;
struct pa {
int idx;
string str;
bool operator<(const struct pa& t)const {
string tmp1 = str + t.str;
string tmp2 = t.str + str;
for (int i = 0; i < tmp1.size(); i++) {
if (tmp1[i] == tmp2[i]) continue;
return tmp1[i] > tmp2[i];
}
return idx > t.idx;
}
};
struct pa arr[1002];
int N;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> N;
for (int i = 0; i < N; i++) {
cin >> arr[i].str;
arr[i].idx = i;
}
sort(arr, arr + N);
if (arr[0].str[0] == '0') {
cout << "0";
return 0;
}
for (int i = 0; i < N; i++) {
cout << arr[i].str;
}
}
'백준' 카테고리의 다른 글
C++[백준]20040번 사이클 게임 (0) | 2023.02.14 |
---|---|
C++[백준]1781번 컵라면 (0) | 2023.02.14 |
C++[백준]2473번 세 용액 (0) | 2023.02.13 |
C++[백준]2143번 두 배열의 합 (0) | 2023.02.12 |
C++[백준]1933번 스카이라인 (0) | 2023.02.12 |