티스토리 뷰
반응형
문제 설명
- 어떤 숫자에서 k개의 수를 제거했을 때 얻을 수 있는 가장 큰 숫자를 구하려 합니다.
- 예를 들어, 숫자 1924에서 수 두 개를 제거하면 [19, 12, 14, 92, 94, 24] 를 만들 수 있습니다.
- 이 중 가장 큰 숫자는 94 입니다.
- 문자열 형식으로 숫자 number와 제거할 수의 개수 k가 solution 함수의 매개변수로 주어집니다.
- number에서 k 개의 수를 제거했을 때 만들 수 있는 수 중 가장 큰 숫자를 문자열 형태로 return 하도록 solution 함수를 완성하세요.
제한 조건
- number는 1자리 이상, 1,000,000자리 이하인 숫자입니다.
- k는 1 이상 number의 자릿수 미만인 자연수입니다.
입출력 예
솔루션
- 스택을 사용했으며, 수행 과정을 간략히 소개하면 아래와 같다.
- 스택이 비어있다면, 숫자를 스택에 삽입한다.
- 스택이 비어있지 않다면, 스택의 꼭대기에 있는 숫자와 현재 숫자를 비교한다.
- 스택 꼭대기에 있는 숫자가 더 크거나 동일하다면, 스택에 현재 숫자를 삽입한다.
- 스택 꼭대기에 있는 숫자가 현재 숫자보다 작다면, 아래 조건들이 참인 동안 스택에 있는 숫자들을 빼고 지워야 하는 숫자 개수를 1 감소시킨다.
- 지워야 하는 숫자 개수 (k) 가 1개라도 있는지
- 스택에 아직 데이터가 들어있는지 (스택이 비어있지 않은지)
- 스택 꼭대기 숫자가 현재 숫자보다 작은지
- 위 조건들 중 하나가 어긋나고 반복 수행을 빠져나온 뒤에는 해당 숫자를 스택에 삽입한다.
- 만약 위 과정을 모두 수행했는데 스택 크기가 우리가 원하는 숫자 개수보다 많다면 개수만큼만 잘라야 한다. (예시 3)
- 그림을 통해 확인해보자.
예시 1 : 1924
예시 2 : 4177252841
예시 3 : 987654
- 스택에 6개가 들어있지만, 우리는 총 숫자길이 6 - 2 (지워야 하는 숫자 개수 k) = 4개로 구성된 숫자를 얻어야 한다.
- 따라서, 스택에서 숫자를 모두 뽑은 뒤 (4 5 6 7 8 9 순으로 뽑힐 것이다), 이를 뒤집는다 (9 8 7 6 5 4).
- 뒤집는 이유는 스택의 특징인 FILO 때문에 먼저 들어간 제일 큰 숫자가 맨 마지막에 나오기 때문이다.
- 스택에서 뽑은 모든 숫자들에 대해 위에서 구한 4개 만큼만 자른다 (파란색).
- 따라서, 스택에서 숫자를 모두 뽑은 뒤 (4 5 6 7 8 9 순으로 뽑힐 것이다), 이를 뒤집는다 (9 8 7 6 5 4).
Code
- 전체 코드 : Solution_makelargenumber
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
26
27
|
public static String solution(String number, int k) {
Stack<Character> stack = new Stack<>();
int n = number.length() - k;
for (int i = 0; i < number.length(); i++) {
if (stack.isEmpty())
stack.push(number.charAt(i));
else {
if (stack.peek() >= number.charAt(i))
stack.push(number.charAt(i));
else {
while (k > 0 && !stack.isEmpty() && stack.peek() < number.charAt(i)) {
stack.pop();
k--;
}
stack.push(number.charAt(i));
}
}
}
StringBuilder sb = new StringBuilder();
while(!stack.isEmpty())
sb.append(stack.pop());
return sb.reverse().substring(0, n).toString();
}
|
cs |
결과
반응형
'Algorithm > Solution' 카테고리의 다른 글
[백준 1976] - 여행 가자 (0) | 2020.03.11 |
---|---|
[백준 5719] - 거의 최단 경로 (0) | 2020.03.10 |
[백준 1261] - 알고스팟 (0) | 2020.03.09 |
[백준 3055] - 탈출 (0) | 2020.03.08 |
[백준 2146] - 다리 만들기 (0) | 2020.03.07 |
댓글