Leetcode Java Lexicographically Minimum String After Removing Stars
업데이트:
문제
코드
class Solution {
public String clearStars(String s) {
char[] charArray = s.toCharArray();
int length = charArray.length;
List<List<Integer>> lists = new ArrayList<>();
for (int i = 0; i < 26; i++) {
lists.add(new ArrayList<>());
}
boolean[] removed = new boolean[length];
for (int i = 0; i < length; i++) {
if (charArray[i] == '*') {
removed[i] = true;
for (int j = 0; j < 26; j++) {
List<Integer> list = lists.get(j);
if (!list.isEmpty()) {
int last = list.size() - 1;
removed[list.get(last)] = true;
list.remove(last);
break;
}
}
} else {
lists.get(charArray[i] - 'a').add(i);
}
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < length; i++) {
if (!removed[i]) {
sb.append(charArray[i]);
}
}
return sb.toString();
}
}
결과
설명
- 문자열 s에서 아래의 절차를 반복 수행한 후 사전적 순서가 가장 작은 문자열을 만드는 문제이다.
- 현재 문자열에서 ‘*‘문자가 존재하는 경우, 해당 문자와 ‘*’ 문자가 아닌 좌측에 존재하는 가장 작은 문자 중 하나를 반복하여 제거한다.
- 문제 풀이에 필요한 변수를 정의한다.
- charArray는 문자열 s를 문자 배열로 저장한 변수이다.
- length는 charArray의 길이를 저장한 변수이다.
- lists는 각 문자들의 위치를 순차적으로 저장할 변수로, ArrayList로 초기화 후 영문자 갯수인 26개의 ArrayList를 다시 넣어준다.
- removed는 제거된 문자인지 기록하기 위한 변수로, length 길이의 부울 배열로 초기화한다.
- 0부터 length 미만까지 i를 증가시킨다.
- charArray의 i번째 문자가 ‘/*‘인 경우, 아래를 수행한다.
- removed[i]의 값을 true로 변경하여 제거된 문자임을 체크해준다.
- 0부터 26 미만까지 j를 증가시키며, list에 lists의 i번째 ArrayList를 넣어준 후 removed 내 list의 마지막 값에 해당하는 위치의 값을 true로 바꾼 후 list의 last번째 값을 제거하고 반복을 중지한다.
- charArray의 i번째 문자가 ‘/*‘가 아닌 경우, lists의 charArray의 i번째 문자 위치의 ArrayList에 i인 위치를 넣어준다.
- charArray의 i번째 문자가 ‘/*‘인 경우, 아래를 수행한다.
-
sb는 사전적 순서가 가장 작은 문자열을 만들기 위한 변수로, 0부터 length 미만까지 i를 증가시키며 제거된 문자가 아닌 경우만 sb에 순차적으로 넣어준다.
- 4번을 통해 제거된 문자를 제외하고 사전적 순서가 작은 문자들을 순차적으로 넣은 sb를 문자열로 변환하여 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기