처음부터 차근차근

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

코딩테스트/Javascript

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

HangJu_95 2024. 1. 4. 23:44
728x90

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/42883

문제 설명

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

예를 들어, 숫자 1924에서 수 두 개를 제거하면 [19, 12, 14, 92, 94, 24] 를 만들 수 있습니다. 이 중 가장 큰 숫자는 94 입니다.
문자열 형식으로 숫자 number와 제거할 수의 개수 k가 solution 함수의 매개변수로 주어집니다. number에서 k 개의 수를 제거했을 때 만들 수 있는 수 중 가장 큰 숫자를 문자열 형태로 return 하도록 solution 함수를 완성하세요.

 

제한 조건

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

내 풀이

function solution(number, k) {
  let numberArray = number.split("");
  let stack = [];

  for (let i = 0; i < numberArray.length; i++) {
    while (
      k > 0 &&
      stack.length > 0 &&
      stack[stack.length - 1] < numberArray[i]
    ) {
      stack.pop();
      k--;
    }
    stack.push(numberArray[i]);
  }

  // 'k'가 여전히 남아있다면 가장 뒷부분의 숫자 제거
  while (k > 0) {
    stack.pop();
    k--;
  }

  // 스택이 비어있다면 0을 반환
  return stack.length === 0 ? "0" : stack.join("");
}
  • Stack을 활용한 풀이법입니다.
  for (let i = 0; i < numberArray.length; i++) {
    while (
      k > 0 &&
      stack.length > 0 &&
      stack[stack.length - 1] < numberArray[i]
    ) {
      stack.pop();
      k--;
    }
    stack.push(numberArray[i]);
  }
  • number의 길이만큼 반복문을 먼저 돌립니다.
  • while문의 조건을 k > 0, stack.length > 0 및 stack의 마지막 수가 넣을려고 하는 수보다 작다면 stack의 마지막을 빼고, k도 감소시킵니다.
  • while문이 끝나면 스택에 숫자를 대입시킵니다.

다른 사람의 풀이

const solution = (number, k) => {
    const stack = [];
    let count = 0;
    for (let i = 0; i < number.length; i++) {
        const item = number[i]
        // stack이 초기에 비어있으면 push 한다.
        if (stack.length === 0) {
            stack.push(item)
            continue;
        }
        // stack에 쌓인 최근 값이 들어와야할 값보다 크거나 같을때까지 꺼낸다.
        while (stack[stack.length - 1] < item) {
            stack.pop()
            count++
            // 만약 숫자를 빼야할만큼 뺐다면 완성된 값을 반환한다.
            if (count === k) return stack.join("") + number.slice(i, number.length)
            // 스택이 비어있으면 루프를 멈추고 스택에 아이템을 추가한다.
            if (stack.length === 0) break;
        }
        stack.push(item)
    }
    // 만약
    return stack.join("").slice(0, number.length - k + count)
}

오늘 배운 점

탐욕법에만 집중하다보니, Stack을 활용할 방법을 상기시키지 못했습니다.

문제를 풀 때, 내가 알고 있는 자료구조나 알고리즘을 좀 더 활용하는 방법이 필요할 것 같습니다.

 

 

 

 

 

'코딩테스트 > Javascript' 카테고리의 다른 글

[프로그래머스] 외계어 사전  (0) 2024.01.09
[프로그래머스] 프로세스  (1) 2024.01.05
[프로그래머스] 조이스틱  (1) 2024.01.04
[프로그래머스] 체육복  (0) 2024.01.02
[프로그래머스] 네트워크  (1) 2024.01.02