첫번째 풀이
두번째 풀이
Dequeue
를 사용하여 풀이가 가능하다.
Dequeue에 저장된 숫자보다 현재 숫자가 더 크고 삭제할수 있는 숫자 개수 k가 남아있다면
현재 숫자보다 작은 숫자를 최대 k개 만큼 삭제하고 현재 숫자를 넣는다.Dequeue에 저장된 숫자보다 작다면
그냥 넣는다.Dequeue에 남아있는 숫자가 N-K보다 많을 수 있기 때문에
Dequeue에 남아있는 숫자를 N-K까지만 꺼내서 반환
한다.설명이 어려워보여서 예시를 보자면
N = 10, K = 4, 4177252841 이 주어졌을때
public class 크게만들기 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
String number = br.readLine();
Deque<Character> dq = new LinkedList<>();
int idx = 0;
int k = K;
while(idx < N){
//현재 숫자
char num = number.charAt(idx++);
//삭제할수 있는 개수(k)가 남아있고 Dequeue에 있는 숫자가 현재 숫자보다 작다면 조건을 만족할때까지 삭제
while(k > 0 && !dq.isEmpty() && dq.getLast() < num){
dq.pollLast();
//숫자 삭제시 삭제할수 있는 개수 감소
k--;
}
dq.offerLast(num);
}
StringBuilder sb = new StringBuilder();
for(int i=0;i<N-K;i++){
sb.append(dq.pollFirst());
}
bw.write(sb.toString());
bw.flush();
bw.close();
}
}
시간초과 풀이
public class 크게만들기_첫번째_풀이 {
static int N;
static int K;
static int[] number;
static List<Number> numbers;
static Queue<Integer> queue;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
String n = br.readLine();
number = new int[n.length()];
numbers = new ArrayList<>();
queue = new LinkedList<>();
for(int i=0;i<n.length();i++){
number[i] = Integer.parseInt(String.valueOf(n.charAt(i)));
numbers.add(new Number(i, number[i]));
}
Collections.sort(numbers);
String answer = start();
bw.write(answer);
bw.flush();
bw.close();
}
static void setNumber(){
int limit = K;
int prevIdx = 0;
while(limit < N){
for(int i=0;i<numbers.size();i++){
if(numbers.get(i).idx > prevIdx && numbers.get(i).idx <= limit){
limit++;
prevIdx = numbers.get(i).idx;
queue.offer(numbers.get(i).num);
numbers.remove(numbers.get(i));
break;
}else if(numbers.get(i).idx < prevIdx){
numbers.remove(numbers.get(i));
}
}
}
}
static String start(){
setNumber();
StringBuilder sb = new StringBuilder();
while(!queue.isEmpty()){
sb.append(queue.poll());
}
return sb.toString();
}
static class Number implements Comparable<Number>{
int idx;
int num;
public Number(int idx, int num){
this.idx = idx;
this.num = num;
}
@Override
public int compareTo(Number o1){
int result = o1.num - this.num;
if(result == 0){
result = this.idx - o1.idx;
}
return result;
}
}
}