해당 빈출 문제집 문제를 하나씩 푸는 중이다.
살짝 주춤하거나 막힌 것 위주로 포스팅을 한다.
숫자 문자열을 하나씩 비교해 나가며 최댓값을 구한다❓ 스택
떠올리자
cnt == K
가 되면 중단한다.ex. 1924 k=2
(empty) 1[924]
-> 1 [924] push 1, cnt:0
1 9[24]
-> 9 [24] pop 1, push 9, cnt:1
9 2[4]
-> 92 [4] push 2, cnt:1
[9]2 4(empty)
-> [9]4 (empty) pop 2, push 4, cnt:2 -> break
ans: 94
만약 여기서 k=3 이었다고 해도 더 이상 input 값이 없으므로 판별이 완료된 값에서 처리해주어야 함.
따라서 94라는 답에서 우리는 N - K
인 1자리만 필요하므로
그때 답은 9.
ex. 1231234 k=3
(empty) 1[231234]
-> 1 [231234] push 1, cnt:0
1 2[341234]
-> 2 [341234] pop 1, push 2, cnt:1
2 3[41234]
-> 3 [41234] pop 2, push 3, cnt:2
3 4[1234]
-> 4 [1234] pop 3, push 4, cnt:3 -> break
ans: 41234
pop
하지 않고 그대로 순회하며 빼내고, 아직 판별하지 않은 input
도 역시 차례대로 ans
에 담아준다.K-cnt
만큼 제외해줘야 한다. 뒷자리를 제외하는 것이 가장 큰 값이 되므로.0~(N-K)
까지가 답이 된다.package solution;
import java.io.*;
import java.util.*;
public class BOJ2812_크게만들기 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st= new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
Queue<Integer> input = new LinkedList<>();
String str = br.readLine();
for (int i = 0; i < N; i++) {
input.add(str.charAt(i) - '0');
}
Stack<Integer> stack = new Stack<>();
int cnt = 0;
while(!input.isEmpty() && cnt < K) {
Integer now = input.poll();
while(true) {
if(stack.empty()) {
stack.push(now);
break;
}
Integer prev = stack.peek();
if(prev < now) {
stack.pop();
cnt++;
if(cnt == K) {
stack.push(now);
break;
}
} else {
stack.push(now);
break;
}
}
}
StringBuilder ans = new StringBuilder();
for(Integer num : stack) ans.append(num);
while(!input.isEmpty()) ans.append(input.poll());
System.out.println(ans.substring(0, N - K));
}
}
import java.util.*;
import java.io.*;
class Solution {
public String solution(String number, int k) {
Stack<Integer> stack = new Stack<>();
int cnt = 0;
int idx = 0;
for(int i = 0; i < number.length(); i++) {
Integer now = number.charAt(i) - '0';
while(true) {
if(cnt == k || stack.empty()) {
stack.push(now);
break;
}
Integer left = stack.peek();
if(left < now) {
stack.pop();
cnt++;
} else {
stack.push(now);
break;
}
}
idx = i;
if(cnt == k) break;
}
StringBuilder tmp = new StringBuilder();
for(Integer n : stack) {
tmp.append(n);
}
String answer = String.valueOf(tmp);
if(idx < number.length() - 1) answer += number.substring(idx + 1, number.length());
return answer.substring(0, number.length() - k);
}
}
while(true)
에서 break 거는 코드가 잦아서 디버깅하는데 시간 소요가 많이 들었다.최근 스택, 그리디를 자주 푸니 방향을 금방 잡을 수 있어서 기분이 조타 *^^*