스택을 이용하여 알고리즘을 풀었다.
알고리즘은 먼저 입력 받을 자릿수와 없애야할 개수를 입력 받고 값을 입력 받는다.
값은 int 값을 넘어서는 수가 오기 때문에 string으로 먼저 받고 나중에 int로 변환하는 식을 사용하였다.
큰수를 만들기 위해서는 현재 수 뒤에 있는 수가 더크면 현재수를 삭제 시켜야 더 큰 수를 만들수가 있다.
따라서 현재 수가 더큰지 뒤의 수가 더큰지를 확인하여야 하며
112 처럼 처음에는 1 과 1이 같아서 삭제하지 않아도 다음 1 과 2를 비교하면 1은 삭제된다.
그러면 12 로 다시 1과 2를 비교하여 1을 삭제 시켜야 하기 때문에 비교하여 삭제시키는 부분을 while문으로
반복 시켰다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int num1 = Integer.parseInt(st.nextToken());
int num2 = Integer.parseInt(st.nextToken());
Stack<Integer> s = new Stack<Integer>();
int count=0;
String strnum = br.readLine();
String[] str = strnum.split("");
for(int i = 0; i<num1; i++) { // 값의 자릿수 만큼 반복
int num3 = Integer.parseInt(str[i]); // 제일 큰 자릿수 부터 받아옴
while(count<num2 && !s.isEmpty() && s.peek() < num3) { // 아직 삭제할 수가 남아있고 스택이 비어있지 않으며 뒤의 수가 앞수 보다 클경우 실행
s.pop(); // 스택에서 제거
count++; // 카운트 증가
}
s.push(num3); // 스택에 넣기
}
StringBuilder sb = new StringBuilder();
for(int i = 0; i < num1 - num2; i++) {
sb.append(s.get(i));
}
System.out.print(sb);
}
}
'코딩테스트' 카테고리의 다른 글
백준 현욱은 괄호왕이야!!(15926번) (0) | 2022.08.30 |
---|---|
백준 스카이라인(1863번) (0) | 2022.08.30 |
백준 탑(2493번) (0) | 2022.08.29 |
백준 옥상 정원 꾸미기(6198번) (0) | 2022.08.29 |
백준 문자열 폭발(9935번) (0) | 2022.08.29 |