b1ackhand 2022. 10. 10. 16:35

2022.10.10

 

문제 출처:

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

 

문제 분석:

단일 숫자들로 수를 만들어서 합쳐서 가장 작은를 만든다.

 

문제 해결:

단순히 가장 작은 수를 만들기 위해서는 정렬해서 큰수가 가장 아랫자리로 가면 된다.

하지만, 0이라는 문제가 있어 이를 처음에는 두 수로 나눠 준다음에 따로 처리를 해줬더니

WR이 나와서

처음부터 0을 생각해서 하나일때는 바로 뒤의 숫자와 교체

두개 이상일때는 마지막 0의 바로 뒤 두수와 교체해주는 형식으로 나누어 정답을 맞았다.

 

 

내 소스코드:

// freopen("input.txt", "r", stdin);
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>

#define rep(i, n) for (int i = 0; i < (int)(n); ++i)
#define rep1(i, n) for (int i = 1; i <= (int)(n); ++i)
#define range(x) begin(x), end(x)
#define sz(x) (int)(x).size()
#define pb push_back
#define F first
#define S second

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int, int> pii;
typedef vector<int> vi;

const int INF = 987654321;

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int N;
	vi v;

	while (true)
	{
		string a = "";
		string b = "";
		int index = 0;
		int zerosum = 0;
		v.clear();

		cin >> N;

		if (!N)
			break;

		for (int i = 0; i < N; i++)
		{
			int tmp;
			cin >> tmp;
			v.push_back(tmp);
			if (tmp == 0)
				zerosum++;
		}

		sort(v.begin(), v.end());

		if (zerosum == 1)
		{
			swap(v[0], v[2]);
		}
		else if(zerosum >= 2)
		{
			swap(v[0], v[zerosum]);
			swap(v[1], v[zerosum+1]);
		}
		

		while (!v.empty())
		{
			if (index == 0)
			{
				a += to_string(v.back());
				v.pop_back();
				index = 1;
			}
			else
			{
				b += to_string(v.back());
				v.pop_back();
				index = 0;
			}
		}

		reverse(a.begin(), a.end());
		reverse(b.begin(), b.end());


		cout << stoi(a) + stoi(b) << "\n";
	}

	return 0;
}