
https://school.programmers.co.kr/learn/courses/30/lessons/120896
주어진 문자열 s 에서 한번만 등장하는 문자를 사전 순으로 정렬한 문자열을 리턴해야 한다.
사전 순으로 정렬해야 한다고 했을 때 TreeSet을 떠올렸다.
그리고 TreeSet안의 요소들을 StringBuilder로 합치면 좋겠다는 아이디어에서 시작했다.
2번 이상 등장한 문자를 제외해야 하는데 그대로 출력되어 테스트 케이스에서 실패했다.
그래서 순서와 관련이 없이 기존에 등장했는 지 여부를 체크하는 블랙리스트용 HashSet을 선언했다.
set은 add를 실패하면 false를 반환한다. 그래서 add를 실패했다면
그리고 사전에 이미 블랙 리스트에 있다면 더하려는 시도조차 하지 않도록 사전 리턴하게 했다.
if(blacklist.contains(c)) continue;
if(!tSet.add(c)) {
blacklist.add(c);
tSet.remove(c);
}
import java.util.*;
class Solution {
public String solution(String s) {
StringBuilder sb = new StringBuilder();
TreeSet<Character> tSet = new TreeSet<>();
Set<Character> blacklist = new HashSet<>();
for(char c : s.toCharArray()) {
if(blacklist.contains(c)) continue;
if(!tSet.add(c)) {
blacklist.add(c);
tSet.remove(c);
}
}
for(Character c : tSet) {
sb.append(c);
}
return sb.toString();
}
}
입문용 문제지만 왜 이렇게 풀었고를 설명할 수 있고 맞아서 뿌듯하다.