Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Latest commit

 

History

History
History
42 lines (37 loc) · 1.67 KB

File metadata and controls

42 lines (37 loc) · 1.67 KB
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package ch09;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.HashMap;
import java.util.Map;
public class P21_2 {
public String removeDuplicateLetters(String s) {
// 문자 개수를 계산해서 담아둘 변수 선언
Map<Character, Integer> counter = new HashMap<>();
// 이미 처리한 문자 여부를 확인하기 위한 변수 선언
Map<Character, Boolean> seen = new HashMap<>();
// 문제 풀이에 사용할 스택 선언
Deque<Character> stack = new ArrayDeque<>();
// 문자별 개수 계산
for (char c : s.toCharArray())
counter.put(c, counter.get(c) == null ? 1 : counter.get(c) + 1);
for (char c : s.toCharArray()) {
// 현재 처리하는 문자는 카운터에서 -1 처리
counter.put(c, counter.get(c) - 1);
// 이미 처리한 문자는 건너뛴다.
if (seen.get(c) != null && seen.get(c))
continue;
// 스택에 있는 문자가 현재 문자보다 더 뒤에 붙여야 할 문자라면 스택에서 제거하고 처리하지 않은 걸로 표시
while (!stack.isEmpty() && stack.peek() > c && counter.get(stack.peek()) > 0)
seen.put(stack.pop(), false);
// 현재 문자를 스택에 삽입
stack.push(c);
// 현재 문자를 처리한 걸로 선언
seen.put(c, true);
}
// 스택에 있는 문자를 큐 순서대로 추출하여 리턴
StringBuilder sb = new StringBuilder();
while (!stack.isEmpty())
sb.append(stack.pollLast());
return sb.toString();
}
}
Morty Proxy This is a proxified and sanitized view of the page, visit original site.