문제: 프로그래머스 - 숫자 짝꿍
import java.util.*;
public class Main {
public String solution(String X, String Y) {
Set<Character> set = new HashSet<>();
for (int i = 0; i < x.length(); i++) {
set.add(x.charAt(i));
}
/*
X, Y 둘 다 존재하는 숫자 찾기
*/
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < y.length(); i++) {
if (set.contains(y.charAt(i))) {
list.add(Character.getNumericValue(y.charAt(i)));
}
}
/*
정렬
*/
Collections.sort(list, Collections.reverseOrder());
/*
정답 만들기
*/
StringBuilder sb = new StringBuilder();
for (int n : list) {
sb.append(n);
}
/*
결과
*/
String answer = sb.toString();
if (answer.isEmpty()) {
return "-1";
}
if (answer.charAt(0) == '0') {
return "0";
}
return answer;
}
}
arr[숫자]++
arr[숫자]--
이번 문제의 핵심은 입력 값을 잘 파악해 불필요한 반복을 줄이고, 여러 개의 문자열을 하나로 만들 때 주의하는 것 같다.
만약 StringBuilder가 아닌 String을 계속 이어 붙였으면 String Constant Pool에 많은 문자열 리터럴이 생겨 불필요한 메모리를 점유했을 것이다.
StringBuilder는 가변 객체이므로 이때 사용하기 적합하다.
import java.util.*;
class Solution {
public String solution(String X, String Y) {
int[] xArr = new int[10];
int[] yArr = new int[10];
/*
숫자 개수 파악
*/
for (String x : X.split("")) {
xArr[Integer.parseInt(x)]++;
}
for (String y : Y.split("")) {
yArr[Integer.parseInt(y)]++;
}
/*
9부터 0까지 존재하는 숫자의 개수 만큼 sb에 붙이기
*/
StringBuilder sb = new StringBuilder();
for (int i = 9; i >= 0; i--) {
while (xArr[i] > 0 && yArr[i] > 0) {
sb.append(i);
xArr[i]--;
yArr[i]--;
}
}
/*
결과 출력
*/
String answer = sb.toString();
if (answer.isEmpty()) {
return "-1";
}
if (answer.charAt(0) == '0') {
return "0";
}
return answer;
}
}