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

nRecode·2021년 3월 26일
0

Algorithm

목록 보기
47/48

문제

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

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

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

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

입출력 예

numberkreturn
"1924"2"94"
"1231234"3"3234"
"4177252841"4"775841"

접근

"1924" 2라는 예시를 들었을때, 두개의 수를 제거를 하면 두개의 수를 리턴해야합니다. 다시말하면 number.length - k 만큼의 길이를 가진 어떤 수가 마지막으로 리턴되어야 합니다. 따라서 마지막 return할 answer의 길이가 number.length - k와 같아질 때까지 반복문을 돌립니다.

반복문안에서 처리할 로직은 다음과 같습니다. "1429" 2라는 예시가 있을때, number.length(4) - k(2)로 총 2개의 수를 뽑아야하는데 만약 9를 맨 처음에 뽑는다면 주어진 조건대로 처리를 할 수 없습니다. 총 두개의 수를 뽑아야 할때는 마지막 하나의 수는 보장하여 "142"중 가장 큰 수 4를 선택하고, 다음을 뽑을때는 0개의 수를 보장하여 4다음 인덱스부터 "29"중 가장 큰 수인 9를 선택합니다.

풀이에서 선언해 줘야할 것은 보장해야하는 수를 나타내는 cnt, 시작인덱스를 표시해 줄 startIdx등이 있습니다.

풀이

function solution(number, k) {
    var answer = '';
    let cnt = number.length - k;
    let length = number.length - k;
    let startIdx = 0;
    
    while(answer.length !== length){
        let maxNum = 0;
        
        for(let i = startIdx; i <= number.length - cnt; i++){
            if(maxNum < number[i]) {
                //startIdx 최대값 다음 인덱스를 저장
                startIdx = i + 1;
                maxNum = number[i];
            }
            
        }
        answer += maxNum;
        cnt--;
    }
    return answer;
    
}

C++에서는 잘 작동하지만 안타깝게도 JS에서는 테스트케이스 10에서 시간초과 오류가 발생합니다ㅜㅜ...
써치를 통해 JS로 풀 수 있는 방법은 다음과 같습니다.

function solution(number, k) {
    let stack = [number[0]];
    let length = number.length - k;
    
    for(let i = 1; i < number.length; i++){
        
        while(k > 0 && stack[stack.length - 1] < number[i]){
            k--;
            stack.pop();
        }
        stack.push(number[i]);
    }
  // ("9412", 2) 같은 예시를 위함
    stack = stack.slice(0, length);
    return stack.join('');
}

스택을 이용한 풀이입니다. 다음 들어오는 요소가 stack에 들어있는 값보다 크다면 stack을 pop하고 그 요소를 push합니다.

profile
안정성, 확장성 있는 서버를 구축하고 가꾸는 개발자를 목표로 공부하고 있습니다. 🤔🤔🤔🤔 부족하기에 맞지 않는 내용이 있을 수 있습니다. 가감없이 피드백 해주시면 정말 감사하겠습니다..🙏

0개의 댓글