카테고리 없음

탐욕법 - 큰 수 만들기

JUNGKEUNG 2024. 8. 14. 19:58
반응형

이 문제는 주어진 숫자 문자열에서 k개의 숫자를 제거하여 만들 수 있는 가장 큰 숫자를 찾는 문제이다. 문제를 해결하기 위해서 각 숫자를 왼쪽에서부터 하나씩 선택하면서 최종적으로 가장 큰 숫자를 만들 수 있는 방법을 찾아야 한다.

import java.util.*;

class Solution {
    public String solution(String number, int k) {        
        
        int len = number.length() - k - 1;
        int idx = 0;
        
        StringBuilder sb = new StringBuilder();
        
        while(len >= 0){
            char max = '0';
            for(int i = idx; i < number.length() - len; i++){
                if(number.charAt(i) > max){
                    max = number.charAt(i);
                    idx = i + 1;
                    if(number.charAt(i) == '9'){
                        break;
                    }
                }    
            }
            sb.append(max);
            len--;
        }  
        
        return sb.toString();
    }      
}

 

문제분석

 - 초기 설정에 len = number.length() - k - 1 : 만들어야 하는 숫자의 길이를 계산해준다.

 - idx  = 0 으로 현재 탐색할 시작 인덱스를 저장해준다.

 - StringBuilder sb = new StringBuilder(); 최종 결과를 저장할 StringBuilder 를 만들어준다.

 

while 로 루프는 만들고자 하는 숫자의 길이만큼 반복하고 max = 9 초기 최대값을 0으로 해준다.

선택된 최대값이 9라면 더 이상 큰 숫자가 없으므로 루플에서 빠져나가고 선택된 최대 숫자는 sb에 추가해준다.

 

 

 

 

총 정리


한 번 탐색 시 한 자릿수의 최대값을 찾아야한다. 만약 최대값이 9 가 오면 sb에 저장하고 반복문을 게속 돌면서 9 가 더이상 없으면 그 다음 큰 숫자를 찾아서 저장하는 방식이다. 숫자의 길이가 얼마나 있냐에 따라 시간 복잡도가 달라진다. 지금코드로 봤을때는 O(n * k) 이다. n는 number 문자열의 길이고, k는 제거할 숫자의 개수이다.