어떤 숫자에서 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" |
number
앞에서부터 고를수 있는 가장 큰 값을 고른다.
만약 number: 1231234
, k: 3
라면, 1231234
에서 4개를 뽑으면 된다.
문자열 | 가능한 후보 | 가장 큰 값 | 설명 |
---|---|---|---|
1231234 | 1231 | 3 | 1231234 중에서 4개를 뽑아야 하니까 최소한 뒷자리 3개는 남겨야 됨, 가능한 후보 1231 중에서 가장 큰 숫자 3을 추출하면 남는 건 1234 |
1234 | 12 | 2 | 1234 중에서 3개를 뽑아야 하니까 뒷자리 2개는 남겨 가능한 후보는 12, 가장 큰 2를 빼면 남는 건 34 |
34 | 3 | 3 | 34 중에서 가능한 선택지가 3밖에 없음 |
4 | 4 | 4 | 4만 남음 |
실행시간을 줄이려고 한 노력들
1. 문자열(배열)을 직접 조작하지 않고 index 값을 저장해서 원하는 값만 추출하기
2. 가장 큰 값을 고르기 위해 반복문을 돌 때 9가 나왔다면 바로 break 하기
3. k개만큼 제거했다면 나머지 뒷자리는 더 이상 탐색하지 않고 바로 return 하기
소스코드
function solution(number, k) {
let answer = [];
let startI = 0;
// 앞에 고를 수 있는 숫자 중에 가장 큰 값 고르고, 그 다음 반복
while (number.length > k) {
let max = -1, maxI = -1;
for (let i=startI; i<=k; i++) {
if (max < number[i]) {
max = number[i];
startI = i+1;
}
// max가 9면 더 이상 찾을 필요 없으니까 break
if (max === "9") break;
}
answer.push(max);
k++;
// 제거할 수 있는 수 다 제거했다면 뒷자리 이어서 return
if (startI === k ) {
return answer.join('') + number.substring(startI);
}
}
return answer.join('');
}