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

재오·2023년 5월 4일
2

코딩테스트

목록 보기
22/46
post-thumbnail

🗒️ 문제

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

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

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

⚠ 제한사항

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

📝 문제 해설

처음에는 배열에 있는 수 중에서 가장 큰 수를 만드는 문제라 인식하여 별거 없네~ 라고 생각하였지만 입출력 예시를 보고 어라? 싶었다. 문자열에 존재하는 수의 순서는 그대로 유지가 되어야 한다는 점을 간과하였다.
스택을 이용하면 이 문제를 해결할 수 있다. 우선 문자열을 모두 배열로 만들고 빈 스택 하나를 만들어준다. 그리고 그 스택이 비어있다면 배열의 원소를 무조건 스택에 넣어준다. 그리고 스택에 있는 값과 배열에 있는 다음 원소값을 비교하여 배열 원소값이 더 크다면 스택에 있는 원소를 pop 해주고 큰 값을 넣어준다. 그리고 k의 값을 하나씩 줄여나간다. 그리고 k의 값이 0이 되어버리면 해당 조건문을 탈출한다. 그리고 나머지 값들을 다 스택에 넣어주면 된다. 스택에 있는 값들을 다시 문자열로 바꿔주고 우리가 원하는 것은 특정 k개를 제외한 나머지 값중에 큰 수이기 때문에 배열 길이에서 k값을 뺀 길이만큼만 return 해주면 풀이가 끝이 난다.

💡 필요 문법

pop()

배열의 가장 마지막에 있는 원소를 꺼낸다.

push()

배열 가장 끝에 특정 원소 값을 집어 넣는다.

substr(a,b)

문자열에서 index a부터 b까지만 추출하여 반환한다.

💻 코드

function solution(number, k) {
    let stack = [];
    number = number.split('');
    
    for(let i=0; i<number.length; i++){
        if(stack.length === 0){
            stack.push(number[i]);
            continue;
        }
        
        while(k > 0 && stack[stack.length -1] < number[i]){
            stack.pop();
            k--;
        }
        
        stack.push(number[i]);
        
    }
    return stack.join('').substr(0, stack.length - k);
}
profile
블로그 이전했습니다

0개의 댓글