fffo

탐욕법(greedy) - 큰 수 만들기 본문

Programming/Algorithm

탐욕법(greedy) - 큰 수 만들기

gggs 2021. 9. 30. 23:57

문제

문제 설명

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

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

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

제한 조건

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

입출력

number k return
"1924" 2 "94"
"1231234" 3 "3234"
"4177252841" 4 "775841"

 

접근 및 풀이

처음 접근은 순차 탐색을 하면서 while(오른쪽 보다 왼쪽이 작으면) {왼쪽으로 가면서 해당 문자를 문자열에서 제거}이런 식으로 접근했는데 생각보다 효율이 나빠서 효율성에서 막혔다. 스텍을 사용하라는 힌트를 얻고 같은 로직을 스택으로 구현하니 훨씬 시간이 줄어서 통과가 됐다. 자료구조의 힘을 느꼈다.

코드

function solution(number, k) {
  let stack = [number[0]];
  let i;
  for (i = 1; i < number.length && k > 0; i++) {
    while (k > 0 && stack.length > 0 && stack[stack.length-1] < number[i]) {
      stack.pop();
      k--;
    }
    stack.push(number[i]);
  }
  let temp = stack.join('');
  number = k > 0 ? temp.slice(0, stack.length - k) : temp + number.slice(i);
  return number;
}

출처

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

'Programming > Algorithm' 카테고리의 다른 글

문자열 - 압축  (0) 2021.10.01
우선순위 큐 - 캐시  (0) 2021.10.01
탐욕법(greedy) - 구명보트  (0) 2021.09.30
가장 큰 정사각형 찾기  (0) 2021.09.29
방문 길이  (0) 2021.09.29
Comments