쉬운 프로그래밍

[알고리즘] 프로그래머스 - 큰 수 만들기 - JAVA 본문

알고리즘/그리디

[알고리즘] 프로그래머스 - 큰 수 만들기 - JAVA

쉬운형 2021. 10. 2. 18:16

https://programmers.co.kr/learn/courses/30/lessons/42883

 

코딩테스트 연습 - 큰 수 만들기

 

programmers.co.kr

문제 설명

어떤 숫자에서 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 = "1234567", k = 3 이라면 4개의 숫자를 골라 최대값을 만들어야한다.

 

1. 0 ~ k 인덱스 사이에서 가장 큰 값을 구한다.

2. 가장 큰 값을 버퍼에 삽입한다.

3. 버퍼 + 1 인덱스를 i라고 할 때, i ~ i + k 사이의 인덱스중 가장 큰 값을 버퍼에 삽입한다.

4. 1 ~ 3을 반복한다.

 

위의 과정을 거치면 문제를 해결할 수 있다. 

 

주의해야할 점은 1234에서 두개를 골라야한다면 43과 같이 순서가 뒤집어지면 안된다.

 

입력으로 주어진 순서를 유지하면서 최대값을 구해야한다.

 

소스코드

class Solution {
    public String solution(String number, int k) {
        StringBuilder sb = new StringBuilder();
        int index = 0;
        int next = 0;
        
        for (int i = 0; i < number.length() - k; i++) {
            int max = 0;
            
            for (int j = index; j <= i + k; j++) {
                int current = number.charAt(j) - '0';

                if (max < current) {
                    max = current;
                    next = j;
                }
            }
            sb.append(max);
            index = next + 1;
        }
        return sb.toString();
    }
}

 

  

Comments