2시간 ~ 3시간 가까이 방법을 찾으려고 했지만 계속해서 실패했고, 결국엔 답안을 보고 풀이를 진행했다.
(※나도 완전탐색 + 스택 풀이 방법 [스택은 전혀 생각하지 못했고 저런식으로 풀어야지만 생각했음 ㅠㅠ] 과 비슷한 알고리즘으로 풀이를 진행하려고 했지만 예외케이스를 제대로 처리하지 못해서 답을 풀지 못했다.)
처음엔 상당히 쉽겠지 라고 생각하고 접근했는데 중간에 몇번 막히다보니 멘붕에 빠져서 풀지못했던 것 같다.
참고 블로그 : https://cyk0825.tistory.com/35
package com.company;
// 출처 : https://cyk0825.tistory.com/35
class Solution {
public String solution(String number, int k) {
//문자열을 합해야 하므로 StringBuilder 사용
StringBuilder sb = new StringBuilder();
//시작 index를 저장하기 위해 변수 생성
int startIndex = 0;
/*
* 주어진 숫자 n에서 k개의 숫자를 빼서 가장 큰 수를 만들어야함
* number의 자릿 수 - k = 만들어야 하는 수의 길이
*
* 가장 큰 수의 첫번째 자리에 올 수 있는 수는 n에서 인덱스가 0~k까지
* 두번째 자리에 올 수 있는 수는 n에서 인데스가 1~k+1에 해당하는 수
* 세번째 자리에 올 수 있는 수는 n에서 인데스가 2~k+2에 해당하는 수 ...
* 이런식으로 해당 자리에 오는 수 중 가장 큰 수를 하나씩 찾는데 그 전수 보다 앞자리에 올 수 는 없기 때문에
* 마지막으로 찾은 자리 수의 인덱스 +1부터 자리에 올 수 있는 가장 마지막 수의 인덱스 까지 비교하며 찾는다.
*/
//for문을 돌면서 확인을 해야함
for (int i = 0; i < number.length() - k; i++) {
int maxValue = Integer.MIN_VALUE;
for (int j = startIndex; j <= i + k ; j++) {
int tempChar = number.charAt(j) - '0';
if(tempChar > maxValue){
maxValue = tempChar;
startIndex = j + 1;
}
}
sb.append(maxValue);
}
return sb.toString();
}
}
import java.util.Stack;
class Solution {
public String solution(String number, int k) {
char[] result = new char[number.length() - k];
Stack<Character> stack = new Stack<>();
for (int i=0; i<number.length(); i++) {
char c = number.charAt(i);
while (!stack.isEmpty() && stack.peek() < c && k-- > 0) {
stack.pop();
}
stack.push(c);
}
for (int i=0; i<result.length; i++) {
result[i] = stack.get(i);
}
return new String(result);
}
}