어떤 숫자에서 k개의 수를 제거했을 때 얻을 수 있는 가장 큰 숫자를 구하려 합니다.
예를 들어, 숫자 1924에서 수 두 개를 제거하면 [19, 12, 14, 92, 94, 24] 를 만들 수 있습니다. 이 중 가장 큰 숫자는 94 입니다.
문자열 형식으로 숫자 number와 제거할 수의 개수 k가 solution 함수의 매개변수로 주어집니다. number에서 k 개의 수를 제거했을 때 만들 수 있는 수 중 가장 큰 숫자를 문자열 형태로 return 하도록 solution 함수를 완성하세요.
제한 조건
입출력 예
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()
를 사용 안하게 했더니 통과가 됐다.