알고리즘/알고리즘 문제풀이
9440번: DigitSum
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;
}