[알고리즘문제풀기] 한 번만 등장한 문자

silver's avatar
Jan 13, 2025
[알고리즘문제풀기] 한 번만 등장한 문자

문제

내가 작성한 정답

import java.util.*; class Solution { public String solution(String s) { String answer = ""; for(int i = 0; i < s.length(); i++){ char c = s.charAt(i); if(s.indexOf(c)==s.lastIndexOf(c)){ answer += c; } } char[] chars = answer.toCharArray(); Arrays.sort(chars); return new String(chars); } }

String을 char배열로 바꾸기

// 1 char[] chars = new char[answer.length()]; for(int i =0; i<answer.length(); i++){ chars[i] = answer.charAt(i); // 2 char[] chars = answer.toCharArray();

다른 사람들의 정답

class Solution { public String solution(String s) { // 알파벳 문자를 세기 위한 배열 생성 -> 알파벳 26개 // 각 문자의 출현횟수 세기 int[] alpha = new int[26]; for(char c : s.toCharArray()){ // 현재 문자의 ASCII 값을 이용하여 해당 문자의 출현 횟수를 증가시킨다. // 'a'는 0, 'b'는 1, ... 'z'는 25로 인덱스가 매핑된다. alpha[c - 'a']++; // 해당하는 문자의 인덱스를 증가시킴 } StringBuilder answer = new StringBuilder(); for(int i = 0; i < 26; i++){ // 출현 횟수가 1인 문자만 결과에 추가 if(alpha[i] == 1){ answer.append((char)(i + 'a')); } } // 알파벳 순서로 인덱스가 정해져서 정렬을 따로 할 필요가 없다. return answer.toString(); } }
import java.util.*; class Solution { public String solution(String s) { char[] chars = s.toCharArray(); Map<Character, Integer> charMap = new HashMap(); for(char c : chars){ // value값으로 (값이 있으면 값을 가져오고 값이 없다면 0을 가져와) 1을 더한다. charMap.put(c, charMap.getOrDefault(c, 0) +1); } StringBuilder sb = new StringBuilder(); for(char c : charMap.keySet()){ if( charMap.get(c) == 1){ sb.append(c); } } char[] charArr = sb.toString().toCharArray(); Arrays.sort(charArr); return new String(charArr); } }
💡
getOrDefault(c, 0):
getOrDefault는 Map 인터페이스에 정의된 메서드! 두 개의 인자를 받는다 : 첫 번째는 찾고자 하는 키(c), 두 번째는 기본값. 만약 키 c가 맵에 존재하면 해당 키의 값을 반환하고, 존재하지 않으면 기본값인 0을 반환한다.

StreamAPI

import java.util.Arrays; import java.util.Map; import java.util.stream.Collectors; class Solution { public String solution(String s) { // String을 쪼개면 배열 -> stream에 던진다 return Arrays.stream(s.split("")) // 이 과정에서 결과는 Map<String, List<String>> 형태가 됩니다. 즉, 키는 문자이고, 값은 해당 문자가 등장한 횟수만큼의 리스트입니다. .collect(Collectors.groupingBy(s1 -> s1)) // Map.Entry 형태의 집합으로 변환 (엔트리는 문자와 해당 문자 리스트의 쌍) .entrySet() .stream() // 각 엔트리의 값(리스트)의 크기가 1 이하인 경우만 필터링 .filter(entry -> entry.getValue().size() <= 1) // 필터링된 엔트리에서 문자(키)만 추출 .map(Map.Entry::getKey) .sorted() .collect(Collectors.joining()); } }
Collectors.groupingBy(s1 -> s1) : s1 -> s1는 각 문자를 그대로 자신의 키로 사용 이 메서드는 문자들을 그룹화하여 Map<String, List<String>> 형태의 결과를 생성합니다. 예를 들어, 입력 문자열이 "abacc"라면, 결과는 다음과 같은 형태의 맵이 된다. { "a" -> ["a", "a"], "b" -> ["b"], "c" -> ["c", "c"] } .entrySet() : 맵의 모든 엔트리(키와 값의 쌍)를 반환 Set<Map.Entry<String, List<String>>> entrySet = { Entry("a", ["a", "a"]), Entry("b", ["b"]), Entry("c", ["c", "c"]) }
💡
entrySet(): Map 인터페이스의 메서드로, 맵에 있는 모든 엔트리를 Set<Map.Entry<K, V>> 형태로 반환한다. 위의 경우에는 Map<String, List<String>>이므로, Set<Map.Entry<String, List<String>>> 형태의 결과를 얻게 된다.
💡
Map.Entry 의 주요 메서드
getKey(): 엔트리의 키를 반환 예: String key = entry.getKey();
getValue(): 엔트리의 값을 반환 예: String value = entry.getValue();
setValue(V value): 엔트리의 값을 변경 예: entry.setValue(newValue);
Share article

silver