프로그래머스: 큰 수 만들기

승헌·2022년 3월 22일
0

프로그래머스 Level 2

목록 보기
12/13

(문제링크)

문제

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

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

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

제한사항

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

입출력 예

numberkreturn
"1924"2"94"
"1231234"3"3234"
"4177252841"4"775841"

풀이

number 앞에서부터 고를수 있는 가장 큰 값을 고른다.

만약 number: 1231234, k: 3 라면, 1231234 에서 4개를 뽑으면 된다.

문자열가능한 후보가장 큰 값설명
1231234123131231234 중에서 4개를 뽑아야 하니까 최소한 뒷자리 3개는 남겨야 됨, 가능한 후보 1231 중에서 가장 큰 숫자 3을 추출하면 남는 건 1234
12341221234 중에서 3개를 뽑아야 하니까 뒷자리 2개는 남겨 가능한 후보는 12, 가장 큰 2를 빼면 남는 건 34
343334 중에서 가능한 선택지가 3밖에 없음
4444만 남음

실행시간을 줄이려고 한 노력들
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('');
}

0개의 댓글