큰 수 만들기
2019, Jun 02
- https://programmers.co.kr/learn/courses/30/lessons/42883
- 그리디 방법으로 풀 수 있는 문제입니다.
- 1924숫자에 2개를 삭제하는 예를 들어 보겠습니다.
- 먼저 정답에 해당하는 문자열을 (전체 문자열 사이즈 - 삭제할 문자의 갯수)를 한 인덱스 부터 끝까지로 하여 부분문자열을 만듭니다.
- 즉 1924에서 삭제할 숫자는 2개이므로 정답에 해당하는 부분문자열은 24로 두고 시작합니다.
- 그러면 우리가 필요한 것은 24에서 불필요하다고 생각하는 부분만 19에서 가져와서 대체하도록 하겠습니다.
- 19에서는 끝자리에서부터 즉, 9 > 1 순으로 탐색을 합니다.
- 24에서는 앞자리에서부터 2 > 4 순으로 탐색을 합니다.
- 처음 비교하게 되는 것은 19의 9와 24의 2 입니다. 9가 2보다 크므로 9와 2를 swap 합니다.
- 따라서 정답은 19는 12가 되고 24는 94가 됩니다.
- 그 다음 94의 4와 12의 2를 비교합니다. 이 때에는 2가 4보다 작으므로 swap 하지 않습니다.
- 다음으로 12의 1과 94의 9를 비교해보겠습니다. 1이 9보다 작으므로 swap하지 않습니다.
- 계속해서 12의 1과 94의 4를 비교해보겠습니다. 1이 4보다 작으므로 swap하지 않습니다.
- 이 방법을 마치면 가장 큰 수를 구할 수 있습니다.
#include <string>
#include <vector>
using namespace std;
string solution(string number, int k) {
string answer = "";
answer = number.substr(k);
for (int i = k - 1; i >= 0; --i) {
int j = 0;
while (1) {
if (number[i] >= answer[j]) {
swap(number[i], answer[j]);
j++;
}
else {
break;
}
}
}
return answer;
}