주어진 문자열에서 한번만 등장한 문자를 모아 사전순으로 배열한 문자열을 반환
1. map으로 문자열이 가진 문자들의 개수를 구해서 개수가 1인 것만 정렬하여 반환
public String solution2(String s) {
String answer="";
char[] chars = s.toCharArray();
Map<Character, Integer> charMap = new HashMap<Character, Integer>();
for(char c : chars){
charMap.put(c, charMap.getOrDefault(c, 0) +1);
}
for(char c : charMap.keySet()){
if( charMap.get(c) == 1){
answer+=c;
}
}
char[] ca = answer.toCharArray();
Arrays.sort(ca);
return new String(ca);
}
2. replaceAll() 메서드를 사용했을 때 변화한 길이가 1인 것만 정렬하여 반환
public String solution(String s) {
String answer = "";
for(int i=0; i<s.length();i++) {
int fLen = s.length();
char c = s.charAt(i);
s=s.replaceAll(s.charAt(i)+"", "");
if(fLen-s.length()==1) {
answer+=c;
}
i--;
}
char[] ca=answer.toCharArray();
Arrays.sort(ca);
answer=String.valueOf(ca);
return answer;
}
문자의 개수를 알기위해 replaceAll()를 사용하면 당시 개수를 알려한 문자도 같이 ""로 변환되기 때문에 i는 증가하고 배열은 감소하여 모든 index를 검사하지 못한다.
다시 i--를 감소시켜줘야 한다.
3. 다른 사람의 풀이에 좋은 풀이가 있었다.
public String solution3(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();
}
알파벳 a를 0번, z를 25번으로 하는 int 배열을 만들고
문자열에 등장하는 문자를 찾아 해당 인덱스에 값을 1씩 증가시킨다.
배열중 1을 원소로 하는 인덱스는 한번만 등장하는 문자로
문자에 'a' 값을 더해줘 실제 알파벳으로 변환해준다.
'Java > Coding Test' 카테고리의 다른 글
겹치는 선분의 길이 문제풀이 (0) | 2023.09.17 |
---|---|
이진수 더하기 문제풀이 (0) | 2023.09.17 |
등수 매기기 문제풀이 (0) | 2023.09.15 |
삼각형의 완성조건(2) 문제풀이 (0) | 2023.09.15 |
영어가 싫어요 문제풀이 (0) | 2023.09.14 |