개발아 담하자

[프로그래머스/C++] 큰 수 만들기 풀이 본문

👩‍💻 알고리즘 풀이/프로그래머스

[프로그래머스/C++] 큰 수 만들기 풀이

choidam 2020. 1. 24. 00:26

프로그래머스 : 큰 수 만들기

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/42883

 

코딩테스트 연습 - 큰 수 만들기 | 프로그래머스

 

programmers.co.kr

 

문제 설명

 

어떤 숫자에서 k개의 수를 제거했을 때 얻을 수 있는 가장 큰 숫자를 구하려 합니다.

예를 들어, 숫자 1924에서 수 두 개를 제거하면 [19, 12, 14, 92, 94, 24] 를 만들 수 있습니다. 이 중 가장 큰 숫자는 94 입니다.

문자열 형식으로 숫자 number와 제거할 수의 개수 k가 solution 함수의 매개변수로 주어집니다. number에서 k 개의 수를 제거했을 때 만들 수 있는 수 중 가장 큰 숫자를 문자열 형태로 return 하도록 solution 함수를 완성하세요.

 

제한 조건

 

  • number는 1자리 이상, 1,000,000자리 이하인 숫자입니다.
  • k는 1 이상 number의 자릿수 미만인 자연수입니다.

 

너무 어려운 그리디 알고리즘 ,, 😭😭

 

#include <string>
#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;

string solution(string number, int k){
    vector<char> bucket; // 조합하고자 하는 배열
    vector<int> removeAt; // 제거하는 배열
   
    // 주어진 숫자로부터 하나씩 꺼내 모으면서, 모아둔 것 중 지금 등장한 것보다 작은 것들을 빼낸다
    for(const auto letter: number){
        // 현재 조합하고자 하는 배열이 비어있는 경우
        if(bucket.empty()){
            bucket.push_back(letter);
            continue;
        }
        // 현재 숫자들이 추가 될 숫자보다 작은 경우 -> 제거
        while(!bucket.empty() && removeAt.size()!=k && bucket.back()<letter){
            removeAt.push_back(bucket.back());
            bucket.pop_back();
        }
        bucket.push_back(letter);
    }
    
    string answer = removeAt.empty() ? number.substr(0, number.size()-k) : string(bucket.begin(), bucket.end());
    return answer;
}