두 정수 X, Y의 임의의 자리에서 공통으로 나타나는 정수 k(0 ≤ k ≤ 9)들을 이용하여 만들 수 있는 가장 큰 정수를 두 수의 짝꿍이라 합니다(단, 공통으로 나타나는 정수 중 서로 짝지을 수 있는 숫자만 사용합니다). X, Y의 짝꿍이 존재하지 않으면, 짝꿍은 -1입니다. X, Y의 짝꿍이 0으로만 구성되어 있다면, 짝꿍은 0입니다.
예를 들어, X = 3403이고 Y = 13203이라면, X와 Y의 짝꿍은 X와 Y에서 공통으로 나타나는 3, 0, 3으로 만들 수 있는 가장 큰 정수인 330입니다. 다른 예시로 X = 5525이고 Y = 1255이면 X와 Y의 짝꿍은 X와 Y에서 공통으로 나타나는 2, 5, 5로 만들 수 있는 가장 큰 정수인 552입니다(X에는 5가 3개, Y에는 5가 2개 나타나므로 남는 5 한 개는 짝 지을 수 없습니다.)
두 정수 X, Y가 주어졌을 때, X, Y의 짝꿍을 return하는 solution 함수를 완성해주세요.
3 ≤ X, Y의 길이(자릿수) ≤ 3,000,000입니다.
X, Y는 0으로 시작하지 않습니다.
X, Y의 짝꿍은 상당히 큰 정수일 수 있으므로, 문자열로 반환합니다.
일단 X와 Y를 잘라서 배열을 만든 다음 각각 반복문을 통해서 둘의 값이 같은 경우 List에 담는 형태로 하면되지 않을까? 이렇게 만들어진 List를 역순으로 정렬한다음 다시 String형태로 변환하면 될것 같은데
import java.util.*;
class Solution {
public String solution(String X, String Y) {
String answer = "";
String[] xArr = X.split("");
String[] yArr = Y.split("");
List<String> arr = new ArrayList<>();
for(int i = 0 ; i < xArr.length ; i++){
String word = xArr[i];
for(int j = 0 ; j < yArr.length ; j++){
if(word.equals(yArr[j])){
arr.add(word);
yArr[j] = " ";
xArr[i] = " ";
break;
}
}
}
if(arr.isEmpty()){
answer = "-1";
}
arr.sort(Collections.reverseOrder());
for(String a : arr){
answer.append(a);
}
return answer.toString();
}
}
answer에 담는 과정에서 뭔가 문제가 있는것 같아서 그대로 구글링해봄..
append의 방법은 String형태로는 가능하지 않은가본데.. StringBuilder을 만들어서 담아줘야하나?
참조 : https://onlyfor-me-blog.tistory.com/317 (StringBuilder 사용하는 이유 : 다수의 String을 더해야하는 경우 기능상의 오류가 생기나?)
import java.util.*;
class Solution {
public String solution(String X, String Y) {
String answer = "";
String[] xArr = X.split("");
String[] yArr = Y.split("");
List<String> arr = new ArrayList<>();
for(int i = 0 ; i < xArr.length ; i++){
String word = xArr[i];
for(int j = 0 ; j < yArr.length ; j++){
if(word.equals(yArr[j])){
arr.add(word);
yArr[j] = " ";
xArr[i] = " ";
break;
}
}
}
if(arr.isEmpty()){
answer = "-1";
}
arr.sort(Collections.reverseOrder());
StringBuilder stringBuilder = new StringBuilder();
for(String a : arr){
stringBuilder.append(a);
}
answer = stringBuilder.toString();
return answer;
}
}
일단 0이 2개인 경우에 00으로 출력되는것부터 해결해봐야겠다..
import java.util.*;
class Solution {
public String solution(String X, String Y) {
String answer = "";
StringBuilder stringBuilder = new StringBuilder();
String[] xArr = X.split("");
String[] yArr = Y.split("");
List<String> arr = new ArrayList<>();
List<String> yList = new ArrayList<>(Arrays.asList(yArr));
for(int i = 0 ; i < xArr.length ; i ++){
String word = xArr[i];
if(yList.contains(word)){
arr.add(word);
yList.remove(word);
}
}
if(arr.isEmpty()){
answer = "-1";
} else {
Collections.sort(arr, Collections.reverseOrder());
// Sort in reverse order
answer = String.join("", arr);
// Join the elements in the list into a string
if (answer.startsWith("0")) {
answer = "0";
}
}
return answer;
}
}
중복된 문자인 경우에는 공백으로 처리하지 않고 완전히 List에서 삭제하는 방향으로 수정하고, "00"으로 처리되는 경우 "0"으로 수정했다.
코드가 너무 오래 걸리나보다... 이건 또 어떻게 해야하나...
class Solution {
public String solution(String X, String Y) {
String answer = "";
StringBuilder sb = new StringBuilder();
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)]++;
}
for(int i = 9 ; i >= 0 ; i--){
while(xArr[i]>0 && yArr[i]>0){
sb.append(i);
xArr[i]--;
yArr[i]--;
}
}
if(sb.toString().startsWith("0")){
return "0";
} else if(sb.toString().equals("")){
return "-1";
}
answer = sb.toString();
return answer;
}
}
시간 초과의 문제때문에 통과를 하지 못해서 방법을 찾아보다가, 각각의 숫자를 인덱스로 잡는 배열을 만들어서 xArr과 yArr을 비교해서 둘다 값이 있다면 StringBuilder에 넣는 방법으로 바꿨다. for문을 반복해서 돌리면 시간초과가 되는 11~15케이스였다. 방법을 바꾸고도 시간이 오래 걸렸다.