[프로그래머스] 큰 수 만들기

klean·2020년 10월 22일
0

문제요약

  1. 10^(6)길이의 숫자 문자열이 주어집니다.
  2. 이 숫자문자열에서 k 범위 : [1,길이) 개의 숫자를 뺐을 때 가장 큰 숫자를 구하세요.
    !!주의!! 문자열의 순서를 바꿀 순 없습니다.

아이디어

질문하기 란에서 정답코드를 봐서 각 자릿수가 뒷자릿수보다 작으면 삭제하는 걸 k 번 반복한다는 걸 알게 되었고
12번 테케가 계속 틀리길래 역시 질문을 봤고 같은 숫자만 있는 경우엔 삭제가 안되고 있다는 걸 알게되었다.

삽질

처음엔 단순히 k번째로 작은 숫자까지를 앞에서부터 차례대로 제거해주면 된다고 잘못생각했는데 테케만 맞고 돌렸을 때 다 틀렸었다.

사실 나는 맨날 코테 볼 때 테케만 맞는지 확인하고 제출하고 넘기는데 다 틀렸던 걸까^^...

12번 테케가 사실 0관련된 걸줄 알고 관련 처리를 열심히 해봤는데 애초에 테케에 '0'이란 문자가 포함된 테케가 없었던 것 같다.

코드

#include <string>
#include <vector>
#include<algorithm>
#include<iostream>
using namespace std;

bool comp_smaller(char &a, char &b){
    return a<b;
}
bool comp_greater(char &a, char &b){
    return a>b;
}

string solution(string number, int k) {
    string answer = "";
    vector<char> nv;
    for(int i = 0;i<number.size();i++){
        nv.push_back(number[i]);
    }
    for(int i = 0;i<k;i++){
        //cout<<"사이즈: "<<nv.size()<<endl;
        bool erased =false;
        for(int j = 0;j<number.size();j++){
            if(nv[j]<nv[j+1]){
                //빼기
                erased= true;
                nv.erase(nv.begin()+j);
                break;
            }
        }
        if(!erased){
            nv.pop_back();
        }
    }
     //앞머리0을 제거하자
    while(!nv.empty()&&*nv.begin() =='0'){
        nv.erase(nv.begin());
    }
    if(nv.empty()){
        nv.push_back('0');
    }
    
    for(int i = 0;i<nv.size();i++){
        answer+=nv[i];
    }
   
    
    return answer;
}

0개의 댓글