본문 바로가기

백준

C++[백준]16496번 큰 수 만들기

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