프로그래머스/Lv. 0(코딩테스트 입문)

[프로그래머스 코딩테스트] 한 번만 등장한 문자(Java)

Sigfriede 2023. 5. 16. 01:10

  문제 설명

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

 

  제한사항

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

 

  입출력 예

s result
"abcabcadc" "d"
"abdc" "abdc"
"hello" "eho"
import java.util.HashMap;
import java.lang.StringBuilder;
import java.util.Arrays;
class Solution {
    public String solution(String s) {
        HashMap<String, Integer> map = new HashMap<>();
        StringBuilder sb = new StringBuilder();
        for (String str: s.split("")) {
            map.put(str, map.getOrDefault(str, 0) + 1);
        }
        for (String key: map.keySet()) {
            if (map.get(key) == 1) {
                sb.append(key);
            }
        }
        String[] str = sb.toString().split("");
        Arrays.sort(str);
        String answer = String.join("", str);
        return answer;
    }
}

  해시맵을 이용하여 풀었습니다. HashMap을 생성합니다. 제네릭 타입은 각각 String과 Integer입니다. 알파벳이 등장할 때마다 Key에는 알파벳이, Integer에는 알파벳이 몇 번 등장했는지 셉니다. StringBuilder를 생성합니다.

  for-each문에서 문자열 s를 구분자 없이, 한 자씩 분리하여 문자열 str이 순차적으로 받습니다. getOrDefault 메소드는 map에서 지정된 key의 value를 반환합니다. 만약 키가 없다면 기본으로 지정된 값을 반환합니다. 방법은 다음과 같습니다.

 

map.getOrDefault(키, 기본값)

 

  이 코드에서는 getOrDefault의 인자로 str과 0를 받고 있습니다. 키를 문자열 str(s의 알파벳), 기본값이 0인 것입니다. 만약 map에 키가 있다면(key 중복을 허용하지 않기 때문에) value에 1을 더해주고, 없다면 키를 추가하고 값을 기본값인 0으로 지정한 뒤 1을 더해주는 것입니다.  이를 for-each문이 순회하는 동안 put 메소드를 이용하여 map에 추가합니다.

  두 번째 for-each문이 keySet 메소드를 이용하여 map의 key값 전체를 가져옵니다. 이를 key 변수가 하나씩 받습니다. if문에서 get 메소드를 이용하여 key의 value를 가져오고 이 값이 1과 같은지 확인합니다. 만약 value가 1이라면 이는 한 번만 등장한 문자라는 뜻입니다. 따라서 이를 append 메소드를 이용하여 StringBuilder에 변수 key(한 번만 등장한 문자)를 추가합니다. 만약 한 번만 등장하지 않은 문자가 없다면 sb에 추가되는 문자도 없을 것이므로, 문제에서 제시하는 빈 문자열을 알아서 반환할 것입니다.

  이렇게 생성한 문자열을 사전 순으로 정렬하는 과정이 필요합니다. 그러나 문자를 사전순으로 정렬하는 메소드는 없습니다. 따라서 sb에 저장된 문자열을 toString 메소드를 이용하여 정상적으로 출력할 수 있는 과정을 거친 뒤, 다시 split 메소드를 이용하여 문자열을 한 자씩 분리하여 배열 str에 삽입합니다.

  Arrays 클래스의 sort 메소드를 이용하여 각 원소를 사전 순으로 정렬합니다. 정렬이 끝난 배열을 String 메소드의 join 메소드를 이용하여 배열을 구분자 없이 문자열로 변경합니다. 이를 answer에 할당합니다.

 

  오랜만에 15일차 클리어.