문제 설명
어떤 숫자에서 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 |
풀이 방법
위에 테스트 예제 중에 3번째 예제로 예를 들어 설명해드릴게요.
4 | 1 | 7 | 7 | 2 | 5 | 2 | 8 | 4 | 1 |
먼저 10개의 숫자 중 4개의 숫자를 제거해야하니 6개의 숫자의 조합을 찾아야합니다.
순서는 변경하지 못하니 저는 구간을 나눠서 최대값을 찾아줬습니다
구간은 길이-k 번 만큼 나눠줄거에요,
첫번째 구간인 0번째부터 k(k=4)번째에서 최대값을 찾아보면 아래와 같습니다.
0~4번째 숫자
4 | 1 | 7 | 7 | 2 |
이 중에서 큰 숫자 7을 뽑아낸 후 그 뒤(3번째)에 숫자부터 i+k(i=1)까지에서 다시 큰 수를 찾습니다.
7 | 2 |
이 중에서 또 큰 숫자 7을 뽑아내고 그 뒤에 숫자부터 i+k(i=2)까지의 구간을 확인해볼게요.
4~6번째
2 | 5 | 2 |
여기서는 5가 제일 크므로 뽑아줍니다. 그럼 그 뒤에 숫자는 6번째부터 확인하면 되겠죠?
6~7번째
2 | 8 |
8를 뽑고나면 8번째 9번째 숫자는 반드시 들어가야합니다. 따라서 4, 1 추가해주면 아래와 같이 나옵니다.
7 | 7 | 5 | 8 | 4 | 1 |
위 방법대로 소스 코드를 작성하면 아래와 같습니다.
자바 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
class Solution {
public String solution(String number, int k) {
int pos = 0;
char max;
StringBuilder answer = new StringBuilder();
if(number.charAt(0) == '0') return "0";
for(int i = 0; i < number.length() - k; i++) {
//문자 길이에서 k개 제거한 길이만큼 반복 ex. 6번(10개 중 4개 제거)
max = '0';
/* 0:1:2:3:4번째 자리 중에 큰 숫자 저장,
자리가 3일 경우 4:5 중에 큰 숫자 저장....
(원래는 1:2:3:4:5) 확인해보지만 이미 뒤에 숫자가 들어갔기 때문*/
for(int j = pos; j <= k + i; j++) {
if(max < number.charAt(j)) {
max = number.charAt(j);
pos = j + 1;
}
}
//숫자를 하나씩 덧붙여줌
}
return answer.toString();
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
'Algorithm' 카테고리의 다른 글
[java] 문자열(String) 함수 참고 (0) | 2020.03.28 |
---|---|
[프로그래머스]Greedy 구명보트 (0) | 2020.03.25 |
[프로그래머스 C++] Greedy 체육복 (0) | 2020.03.23 |
[백준 알고리즘] 1874번 스택 수열 (0) | 2020.03.20 |
[백준 알고리즘]1003번 피보나치 함수(Runtime error 해결) (0) | 2020.03.05 |