본문 바로가기

Programmers/Level2

큰 수 만들기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.util.*;
class Solution {
 
    public String solution(String number, int k) {
        String answer = "";
        int len = number.length() - k;
        int start = 0;
        StringBuilder sb = new StringBuilder();
        
        for (int i = 0; i < len; i++) {
            int max = -1;
            for (int j = start; j <= i + k; j++) {
                int n = number.charAt(j) - '0';
                if (max < n) {
                    max = n;
                    start = j + 1;        
                }
            }
            sb.append(max);
        }
        answer = sb.toString();
        return answer;
    }
}
cs

최대 k개의 수를 제거하여 가장 큰 수를 만드는 알고리즘이다.

k개의 수를 제거한다는 것은 length - k개를 고르는 것과 같다.

선택할 수 있는 최대 범위는 i + k인데, 기본적으로 k개를 제거하기 때문에 인덱스 k까지 확인할 수 있는 것이다.

이 와중에 선택을 1개씩 하기 때문에 i가 추가로 더해진다.

선택을 시작하는 구간은 고정되지 않아서, 이전에 선택한 가장 큰 값이 있던 인덱스 + 1부터 시작한다.

 

모든 경우의 수를 이용하여 구했지만, 메모리 및 시간 초과로 실패한 코드는 아래와 같다.

소수 찾기 문제에서 다른 사람이 작성했던 permutation 함수를 변형하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.util.*;
class Solution {
    public void permutation(String str, int len, HashSet<String> set){
        int n = str.length();
        if (n == len) {
            set.add(str);
            return;
        }
        for (int i = 0; i < n; i++)
            permutation(str.substring(0, i) + str.substring(i + 1, n), len, set);
    }
    public String solution(String number, int k) {
        String answer = "";
        HashSet<String> set = new HashSet<>();
        int len = number.length() - k;
        String answer = "";
 
        permutation(number, len, set);
        answer = Collections.max(set);
        return answer;
    }
}
cs

 

참고 사이트

'Programmers > Level2' 카테고리의 다른 글

조이스틱  (0) 2021.07.22
프린터  (0) 2021.07.21
짝지어 제거하기  (0) 2021.07.20
소수 찾기  (0) 2021.07.19
단체사진 찍기  (0) 2021.07.19