Link https://www.acmicpc.net/problem/10610
소스결과 2232 KB / 4ms
출처 Baekjoon, COCI 2014/2015 Contest #4 1번
언어 C++ 17
분류 그리디 알고리즘
설명
왜 30을 존경하는지 모르는 미르코덕에 길거리에서 찾은 수를 가지고 30의 배수가 되는 가장 큰 수를 만들어야 한다.
리모콘부터 시작해서 세상에는 정말 독특한 친구가 많다
이 문제의 유의점은 N은 최대 10^5 개의 숫자로 구성이 되어있다. 인데
저걸 최대 값이 10000이 아닌 10만자리의 수로 봐야 한다.
10만자리의 수를 받을 수 있는 자료형은 문자열 말고는 없다.
30의 배수가 되려면 1의 자리가 무조건 0 이어야 한다. => 0이 없으면 만들 수 없다.
1의 자리를 제외하고 나머지의 값이 3의 배수가 되어야 한다 => 모든 자리의 합이 3의 배수면 30의 배수가 된다.
가장 큰 수를 만들어야 한다 => 두개의 조건이 만족되면 9부터 채워나간다.
그리디 알고리즘이 적용되는 부분은 가장 큰 수를 만들때 가장 큰 값이 앞에 들어간다.
이 부분인거 같다. 문제의 의도가 잘 이해가 안된다.
알고리즘
1. 최대 10만자리의 문자열을 받는다.
2. 문자열의 각 자리의 수의 개수를 저장한다.
3. 0의 개수가 1개 이상인지 확인한다,
4. 수의 합이 3의 배수가 되는지 확인한다.
5. 3, 4의 조건을 만족한다면 9부터 개수만큼 채워 나간다.
6. 출력
소스코드
#include <iostream>
#include <string>
using namespace std;
const int MAX = 100000;
int main()
{
int digits[10] = {};
char res[MAX + 1] = { '-', '1', };
string input;
cin >> input;
for (int i = 0; i < input.length(); i++)
digits[input[i] - '0']++;
if (digits[0])
{
int isAble = 0;
for (int i = 1; i < 10; i++)
isAble += i * digits[i];
if (isAble % 3 == 0)
{
int pos = 9;
for (int i = 0; i < input.length(); i++)
{
while (digits[pos] == 0)
pos--;
res[i] = pos + '0';
digits[pos]--;
}
}
}
cout << res;
return 0;
}
'Algorithm > Greedy Algorithm' 카테고리의 다른 글
Baekjoon 1541 잃어버린 괄호 (0) | 2019.03.08 |
---|---|
Baekjoon 1049 기타줄 (0) | 2019.01.16 |
BaekJoon 2875 대회 or 인턴 (0) | 2019.01.16 |
BaekJoon 11047 동전 0 (0) | 2019.01.16 |
BaekJoon 11399 ATM (0) | 2019.01.16 |