반응형
스택을 사용하는 그리디 문제였다.
이 문제는 숫자의 앞에서부터 스택에 집어넣으며 순서를 지키며 가장 큰 수를 만드는 문제이다. 즉 다음과 같은 로직을 가진다. 현재 스택에 집어넣어야할 숫자에 대해서 만일 지울 수 있는 횟수가 남아있고, 스택의 top 값이 현재 숫자보다 작다면 스택의 top을 제거하는 것을 반복하고 현재 숫자를 스택에 push해주는 원리이다. 그후 최종적으로 N-K만큼의 길이를 스택의 bottom에서부터 보여주는 방식으로 해결할 수 있다.
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
package algosutdy1;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Deque;
import java.util.LinkedList;
import java.util.StringTokenizer;
public class Main_bj_2812_크게만들기 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
Deque<Integer> deque = new LinkedList<>();
String input = br.readLine();
int delete = 0;
for (int i = 0; i < input.length(); i++) {
int next = input.charAt(i) - '0';
while (true) {
if (deque.isEmpty() || (delete >= K)) {
break;
}
int top = deque.peekLast();
if (top < next) { //지울수있는 경우 현재 기준 앞에있는 작은 수를 지울수있는 곳까지 지워주는게 이득
deque.removeLast();
delete += 1;
} else {
break;
}
}
deque.addLast(next);
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < N - K; i++) {
sb.append(deque.removeFirst());
}
System.out.println(sb.toString());
}
}
|
반응형
'Algorithm' 카테고리의 다른 글
[BOJ] 4485. 녹색 옷 입은 애가 젤다지? (0) | 2021.05.24 |
---|---|
[BOJ] 14442. 벽 부수고 이동하기2 (0) | 2021.05.16 |
[BOJ] 3687. 성냥개비 (0) | 2021.05.12 |
[BOJ] 1918. 후위 표기식 (0) | 2021.05.12 |
[BOJ] 12015. 가장 긴 증가하는 부분 수열2 (0) | 2021.05.09 |