문제
N자리 숫자가 주어졌을 때, 여기서 숫자 K개를 지워서 얻을 수 있는 가장 큰 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N과 K가 주어진다. (1 ≤ K < N ≤ 500,000)
둘째 줄에 N자리 숫자가 주어진다. 이 수는 0으로 시작하지 않는다.
출력
입력으로 주어진 숫자에서 K개를 지웠을 때 얻을 수 있는 가장 큰 수를 출력한다.
제한
- 시간 제한 : 1초
- 메모리 제한 : 128MB
문제 풀이 과정
큰수들만 남기면 남아 있는 숫자가 가장 큰 값이다.
Stack 을 사용하면 된다.
숫자를 하나씩 넣으면서, 넣는 숫자보다 작은 값은 모두 빼버린다.
그리고 마지막에 마저 못뺀 숫자들도 빼야되기 때문에 맨뒤에서 부터 빼면 된다.
정답 코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;
class Main2812 {
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());
String num = br.readLine();
Stack<Character> s = new Stack<>();
for (int i = 0; i < N; i++) {
char input = num.charAt(i);
while (K > 0 && !s.isEmpty() && s.peek() < input) {
s.pop();
K--;
}
s.add(input);
}
StringBuilder sb = new StringBuilder();
while (!s.isEmpty()) {
if (K > 0) {
K--;
s.pop();
continue;
}
sb.append(s.pop());
}
System.out.println(sb.reverse());
}
}