본문 바로가기
알고리즘

[알고리즘] 프로그래머스 큰 수 만들기(Level 2) [자바/JAVA] 풀이- 개발하는 지토

by 개발하는 지토 2020. 9. 2.

문제 설명

어떤 숫자에서 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

 

 

풀이 코드 [자바/java]

class Solution {
    public String solution(String number, int k) {
        StringBuilder sb = new StringBuilder();
        int index = 0;
        int max = 0;
        for(int i=0; i<number.length() - k; i++) {
            max = 0;
            for(int j = index; j<= k+i; j++) {
                if(max < number.charAt(j)-'0') {
                    max = number.charAt(j)-'0';
                    index = j+1;
                }
            }
            sb.append(max);
        }
        return sb.toString();
    }
}

내 문제풀이 방법 설명

 

먼저 return 해야 할 문자의 길이는 매개변수로 들어온 number의 길이에서 k만큼을 빼준 길이가 된다.

그래서 for문을 먼저 만들어야 할 문자의 길이만큼 반복을 했다.

그 이후에 가장 큰 수를 탐색하여 StringBuilder에 붙혀주고 return 해주면 되는데..

조건에서 k만큼의 수를 제거했을때 가장 큰 수 이기 때문에

두번째 for문의 범위는 탐색해야하는 문자의 시작(index)부터, 앞으로 이어붙혀야할 문자의 길이 -1이 뒤에 남는 index까지 탐색을 해야한다.

그리고 index에는 가장 큰수 다음 index를 넣어준다.

이유는 그 다음 문자열부터 가장 큰 수를 찾아야하기 때문이다.

 

[입출력 예]의 3번 예제로 예를 들면

'4177252841' 를 0번 index부터 탐색을 시작하여 총 6자리의 return 값을 만들어야 하기 때문에 뒤에서 6번째에 위치한 '41772' 까지 탐색을 진행한다.

그리고 StringBuilder에 가장 큰 수를 append한다.

그러면 이제 앞으로 5자리를 이어 붙히면 되고, 이제 탐색할 시작 index는 가장 큰 수였던 3번인덱스 다음인 4번인덱스 부터 순회한다.

'7252841' 문자열을 탐색하는것이다.

그러면 앞의 규칙에 따라 뒤에서 5번째에 위치한 '725' 까지 탐색을 진행하고 가장큰수를 append한다.

그 다음은 '252841' 문자열을 뒤에서 4번째인 '252' 까지,

그 다음은 '2841' 문자열을 뒤에서 3번째인 '28' 까지,

그 다음은 '41' 문자열을 뒤에서 2번째인 '4' 까지,

그 다음은 '1' 문자열을 뒤에서 1번째인 '1' 까지,

모든 범위가 끝나게되면 현재까지 진행했던 가장큰수를 이어붙인 '775841'가 만들어질것이고

return 해주면 된다.

 

댓글