[알고리즘] 프로그래머스 - 큰 수 만들기

do_large·2020년 10월 16일
0

알고리즘

목록 보기
9/50
post-thumbnail

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

function solution(number, k) {
    let cnt=0; // 제거한 숫자의 개수를 저장
    let stack=[]; 
    
    //문자열을 분리해서 숫자의 배열로 만든다.
    let numArr = number.split('').map(num=>parseInt(num));
    
    for(let i = 0; i < numArr.length; i++){
        if(stack.length===0){
          // stack이 비어있으면 비교할 값이 없으므로 stack에 i번째 값을 넣고 다음 index로 넘어간다.
            stack.push(numArr[i]);
            continue;
        }
        
      // stack에 값이 있고, 그 값이 numArr[i]의 값보다 작을때는 제거해야 한다.
      // 값을 제거했기때문에 cnt에 1을 더해주고, 
      // 만약 cnt가 k와 같아졌을때는 더이상 숫자를 제거할수 없기때문에 while문을 빠져나간다.
        while(stack.length && stack[stack.length-1] < numArr[i]){
            stack.pop();
            cnt++;
            if(cnt===k) break;
        }
        
        // 위의 조건문에 걸리지 않았기 때문에 stack에 numArr[i]를 넣어준다.
        stack.push(numArr[i]);

      // 더이상 값을 제거할수 없을땐 stack의 값들을 string으로 만들어주고 number의 i+1인덱스 이상의 값을 뒤에 붙여준다.
        if(cnt===k) {
            return stack.join('')+number.substr(i+1);
        }
    }
    
  // 여기까지 왔다는 것은 k만큼 값이 제거되지않았다는 것이기 때문에
  // stack에 있는 값들을 string으로 연결하고 뒷자리부터 더 제거해야하는 갯수만큼 제외한 나머지를 return 한다.
    return stack.join('').slice(0, number.length - k + cnt);
}

0개의 댓글