큰 수 만들기

큰 수 만들기

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;

}