코딩테스트/프로그래머스

[프로그래머스] 큰 수 만들기 - JAVA

ankisile 2023. 10. 30. 14:10

문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이

제거할 문자 K개를 찾는다는 말은 포함할 문자가 NUMBER길이 - K 개라는 뜻이다.

따라서 for문을 이용하여 포함할 문자의 개수만큼 포함할 문자를 찾는다.

두번째 for문의 범위는 탐색해야하는 문자의 시작(index)부터, k+i까지 탐색을 해야한다.

(k+i까지 탐색해야 포함할 문자를 number-k개 찾을 수 있다) 

그리고 index에는 가장 큰수 다음 index를 넣어준다. 이유는 그 다음 문자열부터 가장 큰 수를 찾아야하기 때문이다.

주의 해야 할 것은 String으로 문자열을 만드는 것보다 StringBuilder로 만들어야 시간초과가 안난다.

 

예를 들어,

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

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

딧; 탐색할 시작 index는 가장 큰 수였던 3번인덱스 다음인 4번인덱스 부터 순회한다.

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

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

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

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

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

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

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

return 해주면 된다.

 

 

코드

import java.util.*;

class Solution {
    public String solution(String number, int k) {
        StringBuilder sb = new StringBuilder();
        
        int idx = 0;   
        for(int i=0;i<number.length()-k;i++){
            char max = '0';
            for(int j=idx;j<=k+i;j++){
                if(max < number.charAt(j)){
                    max = number.charAt(j);
                    idx = j+1;
                }
            }
            
            sb.append(max);
            // System.out.println(idx +" "+(i));
            if(idx == number.length() - i+1){
                sb.append(number.substring(idx));
                break;
            }
        }
        
        return sb.toString();
    }
}