1 minute read

한 번만 등장한 문자

문제 설명

문자열 s가 매개변수로 주어집니다. s에서 한 번만 등장하는 문자를 사전 순으로 정렬한 문자열을 return 하도록 solution 함수를 완성해보세요. 한 번만 등장하는 문자가 없을 경우 빈 문자열을 return 합니다.


제한사항

  • 0 < s의 길이 < 1,000
  • s는 소문자로만 이루어져 있습니다.

입출력 예

s result
“abcabcadc” “d”
“abdc” “abcd”
“hello” “eho”

입출력 예 설명

입출력 예 #1

  • “abcabcadc”에서 하나만 등장하는 문자는 “d”입니다.

입출력 예 #2

  • “abdc”에서 모든 문자가 한 번씩 등장하므로 사전 순으로 정렬한 “abcd”를 return 합니다.

입출력 예 #3

  • “hello”에서 한 번씩 등장한 문자는 “heo”이고 이를 사전 순으로 정렬한 “eho”를 return 합니다.

나의 풀이 코드

import java.util.*;

class Solution {
    public String solution(String s) {
        String answer = "";
        List<String> result = new ArrayList<>();
        //리스트로 바꾸고
        List<String> list = Arrays.asList(s.split(""));
        //반복문 안에서 각 요소를 기준으로 같으면 cnt++
        
        for(int i=0; i<list.size(); i++){
            int cnt=0;
            for(int j=0; j<list.size(); j++){
                if (list.get(i).equals(list.get(j))){
                    cnt++;
                }
            }
            if(cnt==1){ //cnt가 1인 요소만 선별
                result.add(list.get(i));
            }
        }
        Collections.sort(result);        
        answer= String.join("",result);
        
        return answer;
    }
}

각 요소의 존재 횟수를 구해서 그것이 1인 경우를 취합한 방법이다.

배운점

class Solution {
    public String solution(String s) {
        return Arrays.stream(s.split(""))
                .collect(Collectors.groupingBy(s1 -> s1))
                .entrySet()
                .stream()
                .filter(entry -> entry.getValue().size() <= 1)
                .map(Map.Entry::getKey)
                .sorted()
                .collect(Collectors.joining());
    }
}

다른 사람이 푼 코드이다.

문자열을 문자열배열로 스트림으로 변환후,
문자열을 그룹화한다. 예를 들어 h는 h로, e는 e로 매핑이다.
맵의 키와 값을 스트림으로 변환,
다시 스트림으로 변환,
각값의 엔트리 사이즈가 1이하인것만 필터링후,
맵의 키만 추출,
정렬 후,
문자열로 join한다.

Leave a comment