프로그래머스 코딩 문제 2021/02/25 - Lv.2 큰 수 만들기

이호현·2021년 2월 25일
0

Algorithm

목록 보기
85/138

[문제]

어떤 숫자에서 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

[풀이]

function solution(number, k) {
  let answer = '';
  let numberIdx = 0;
  let idx = 0;

  while((k > 0) && (answer.length < (number.length - k))) {
    const subStr = number.substr(numberIdx, k + 1);
    const maxNum = subStr.includes('9') ? '9' : Math.max(...subStr.split(''));
    idx = subStr.indexOf(maxNum);
    k -= idx;
    answer += maxNum;
    numberIdx += (idx + 1);
  }

  if(idx < number.length - 1) answer += number.substr(numberIdx)

  // 같은 숫자만 반복될 때 걸러내기
  if(k > 0) return answer.slice(0, answer.length - k);

  return answer;
}

큰 수를 만들려면 높은 자리 숫자가 클 수록 커지니까 왼쪽에서 부터 큰 숫자를 찾아가는식으로 했다.

number에서 관리할 numberIdx와 반복문 돌 때마다 자른데서 관리할 idx 두개를 만들어서 index를 관리하게 한다.

그 다음으로 왼쪽에서 잘라야되는 개수에서 하나 더한 k + 1개 만큼에서 가장 큰 숫자를 구하고 answer에 누적시킨 후 그 숫자의 인덱스를 찾는다.

그리고 그 숫자의 앞쪽의 요소들은 날려야 되니 그 만큼 k를 감소시키고, 이 작업을 k가 0이상이거나 누적된 answer가 찾아야되는 길이보다 작을 때 계속 반복한다.

몇 가지 특수 케이스를 걸러내기 위해 추가 작업을 했다.

만약 같은 숫자가 계속 반복되면 k가 감소하지 않기 때문에 두 번째 조건에서 반복문을 빠져나오고 k를 뺀 만큼의 자리수만 표시되게 한다.

그리고 한 케이스에서 계속 런타임 에러가 났는데 잘라낸 숫자들에서 9가 있으면 Math.max()를 사용 안하게 했더니 통과가 됐다.

profile
평생 개발자로 살고싶습니다

0개의 댓글