

나의 풀이
import java.util.*;
class Solution {
public String solution(String X, String Y) {
HashMap<Character, Integer> map = new HashMap<>(); // 1
for (char c : X.toCharArray()) {
map.put(c, map.getOrDefault(c, 0) + 1);
}
StringBuilder sb = new StringBuilder(); // 2
for (char c : Y.toCharArray()) {
if (map.containsKey(c) && map.get(c) > 0) {
sb.append(c);
map.put(c, map.get(c) - 1);
}
}
String answer = sb.toString(); // 3
if (answer.isEmpty()) {
return "-1";
} else {
char[] answerArray = answer.toCharArray();
Arrays.sort(answerArray);
for (char c : answerArray) {
if (c != '0') return new StringBuilder(new String(answerArray)).reverse().toString();
}
return "0";
}
}
}
과정
- 문자열 X의 각 문자를 키로 가지고 해당 문자의 빈도수를 밸류값으로 가지는 해시맵을 생성하고, 문자열 X의 각 문자를 해시맵에 추가하고, 이미 존재하는 문자라면 그 문자의 빈도수를 1 증가시킨다
- 문자열 Y를 순회하고 각 문자가 해시맵에 존재하는지 확인한다. 존재한다면 결과 문자열에 추가하고 빈도수 1 감소
- answer이 비어있다면 -1을 리턴, answer이 0이외에 다른 문자열이 포함되어 있으면 answer리턴, 아니면 0을 리턴한다
다른 사람 풀이
class Solution {
public String solution(String X, String Y) {
StringBuilder answer = new StringBuilder();
int[] x = {0,0,0,0,0,0,0,0,0,0};
int[] y = {0,0,0,0,0,0,0,0,0,0};
for(int i=0; i<X.length();i++){
x[X.charAt(i)-48] += 1;
}
for(int i=0; i<Y.length();i++){
y[Y.charAt(i)-48] += 1;
}
for(int i=9; i >= 0; i--){
for(int j=0; j<Math.min(x[i],y[i]); j++){
answer.append(i);
}
}
if("".equals(answer.toString())){
return "-1";
}else if(answer.toString().charAt(0)==48){
return "0";
}else {
return answer.toString();
}
}
}
- 배열을 생성하고, 아스키코드를 참조한듯하다. 시간 복잡도가 훨씬 효율적이다