한 번만 등장한 문자
문제 #
문자열 s
가 매개변수로 주어집니다. s
에서 한 번만 등장하는 문자를 사전 순으로 정렬한 문자열을 return 하도록 solution 함수를 완성해보세요. 한 번만 등장하는 문자가 없을 경우 빈 문자열을 return 합니다.
- 제한사항
- 0 <
s
의 길이 < 1,000 s
는 소문자로만 이루어져 있습니다.
- 0 <
- 입출력 예
s result “abcabcadc” “d” “abdc” “abcd” “hello” “eho”
나의 풀이 #
import java.util.*;
class Solution {
public String solution(String s) {
String[] strArr = s.split("");
Arrays.sort(strArr);
String str = String.join("",strArr);
// 사전 순으로 정리된 값을 순서대로 비교 후 같을경우 문자열에서 삭제한다.
for(int i = 0; i<strArr.length-1; i++) {
if(strArr[i].equals(strArr[i+1])){
str=str.replace(strArr[i],"");
}
}
return str;
}
}
다른 사람의 풀이 #
// 알파벳별로 나타난 횟수를 카운트 한 후 횟수가 1인 알파벳을 answer에 추가하는 방식
class Solution {
public String solution(String s) {
int[] alpha = new int[26];
for(char c : s.toCharArray()){
alpha[c - 'a']++;
}
StringBuilder answer = new StringBuilder();
for(int i = 0; i < 26; i++){
if(alpha[i] == 1){
answer.append((char)(i + 'a'));
}
}
return answer.toString();
}
}
- 나의 풀이 보다 더 빠른처리가 가능함.
//n번째 알파벳을 지우기전,후의 길이차가 1일경우 중복이 아님을 이용
import java.util.*;
class Solution {
public String solution(String s) {
HashSet<String> set = new HashSet<>();
for (int i = 0; i < s.length(); i++) {
String replace = s.replace(s.charAt(i) + "", "");
if(s.length() - replace.length() == 1){
set.add(s.charAt(i)+"");
}
}
ArrayList<String> list = new ArrayList<>(set);
Collections.sort(list);
return String.join("", list);
}
}
- 의문점 : 중복이 일어나지 않고
TreeSet
을 사용하지도 않지만set.add
한 후list
형변환 후Collection.sort(list)
의 형태로 오름차순 정렬하였다.list
만 사용시 5~10ms의처리시간,TreeSet
사용시 6~8ms의 처리시간,HashSet
사용시 6~9ms의 처리시간HashSet
대신List
에 바로 저장하여도 테스트에 통과하였다. > 처리시간때문인듯 함TreeSet
에 저장하여join
하여도 테스트에 통과하였다.
관련개념 학습 #
- 관련 개념을 찾아서 공부한 내용을 적는다.
ctrl + p
로 내가 필기한 내용 중에서 관련내용이 있는지 찾아서 그 페이지의 링크를 복사하여 붙혀넣는다.- 필기 페이지에도 이 문제의 링크를 복사하여 “관련 문제"라고 써놓고 붙혀넣는다.