[JAVA] 프로그래머스 : 한 번만 등장한 문자

문제 설명

Link

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

My Solution

Code

public class P120896 {    
    public String solution(String alpabet) {  
  
        if (Objects.equals(alpabet, "") || alpabet == null) {  
            return "";  
        }  
  
        HashMap<String, Integer> answerMap = new HashMap<>();  
			  // Step1
        for (char ch : alpabet.toCharArray()) {  
            var key = String.valueOf(ch);  
            answerMap.putIfAbsent(key, 0);  
  
            Integer count = answerMap.get(key);  
            answerMap.put(key, count + 1);  
        }  
		    // Step2
        StringBuilder sb = new StringBuilder();  
        for (String key : answerMap.keySet()) {  
            int count = answerMap.get(key);  
            if (count == 1) {  
                sb.append(key);  
            }  
        }  

			  // Step3
        char[] chars = sb.toString().toCharArray();  
        Arrays.sort(chars);  
  
        return new String(chars);  
    }
}

Approach

  • 문제에서 “한 번만 등장”하는 문자를 사전 순서대로 정렬을 요구함
    1. “한 번만 등장” 은 “중복된 문자”는 카운트하지 않는다라고 가정함
    2. “중복된 문자”를 파악하기 위해 HashMap 사용함

Step1

  1. HashMap을 선언하고 다음과 같은 순서에 따라 HashMap 초기화
    1. 주어진 문자열 “s”를 반복하며 HashMap에 들어있지 않다면 0으로 초기화
      1. putIfAbsent(key, 0)
    2. 문자열의 원소에 대해 카운트
      1. Integer count = answerMap.get(key)
    3. 이후 answerMap에 “문자열 원소”의 카운트를 1씩 증가시킴

Step2

  1. step1에서 초기화된 HashMap의 원소 중 value가 “1”인 게 정답 문자열임
  2. count 수가 1인 것만 StringBuilder로 초기화

Step3

  1. 사전 순으로 정렬해야하기 때문에 StringBuilder를 문자 배열로 변환한뒤 Arrays.sort를 사용해 문자열 정렬 후 정답 리턴

Review

생각한 순서대로 구현하긴 했지만 코드가 너무 장황한 듯 싶다.

연산 -> 변환 -> 연산 -> 변환의 과정

다른 방법으로 처리할 순 없을까 ?

Enhanced

다른 사람 풀이

Categories:

Updated:

Leave a comment