99클럽 코테 스터디 35일차 TIL
💙 JAVA 비기너
class Solution {
public String solution(String X, String Y) {
StringBuilder answer = new StringBuilder();
int[] xCntArr = new int[10];
int[] yCntArr = new int[10];
for(int i=0; i<X.length(); i++) {
xCntArr[X.charAt(i) - '0'] += 1;
}
for(int i=0; i<Y.length(); i++) {
yCntArr[Y.charAt(i) - '0'] += 1;
}
for(int i=9; i>=0; i--) {
int N = Math.min(xCntArr[i], yCntArr[i]);
for(int j=0; j<N; j++) {
answer.append(i);
}
}
if("".equals(answer.toString())) {
return "-1";
} else if('0' == (answer.toString().charAt(0))) {
return "0";
} else return answer.toString();
}
}
몇번이나 실패했는지...!!!!
처음에는 단순하게 이중for문을 통해 하나하나 비교하도록 만들었다.
class Solution {
public String solution(String X, String Y) {
String answer = "";
String[] xArr = X.split("");
String[] yArr = Y.split("");
ArrayList<Integer> answerList = new ArrayList<>();
for(int i=0; i<xArr.length; i++) {
for(int j=0; j<yArr.length; j++) {
if(xArr[i].equals(yArr[j])) {
answerList.add(Integer.parseInt(xArr[i]));
yArr[j] = "x";
break;
}
}
}
answerList.sort(Comparator.reverseOrder());
if(answerList.isEmpty()) {
answer = "-1";
} else {
boolean first = true;
for(int num : answerList) {
answer += num;
if(first == true && num == 0) {
break;
} else if(first == true) {
first = false;
}
}
}
return answer;
}
}
하지만 시간초과로 실패...
그 뒤로 StringBuilder로 바꿔보기도 하고 다양한 방법을 시도해봤으나 계속 실패였다...
HashMap을 사용해서 같은 숫자 수를 저장할까? 고민하다가 배열로 하면 안되나? 싶어서 만들어본 두번째 코드
class Solution {
public String solution(String X, String Y) {
String answer = "";
int[] xCntArr = new int[10];
int[] yCntArr = new int[10];
for(int i=0; i<X.length(); i++) {
xCntArr[X.charAt(i) - '0'] += 1;
}
for(int i=0; i<Y.length(); i++) {
yCntArr[Y.charAt(i) - '0'] += 1;
}
for(int i=9; i>=0; i--) {
int N = Math.min(xCntArr[i], yCntArr[i]);
for(int j=0; j<N; j++) {
answer += i;
}
}
if("".equals(answer)) {
answer = "-1";
} else if('0' == (answer.charAt(0))) {
answer = "0";
}
return answer;
}
}
첫번째보다 더 느려진 코드...
"감자의 생각은 어리석었을뿐인가...?ㅠㅠㅠ 다시 싹 지우고 HashMap으로 변경할까?" 하고 절망하다가
answer
이 너무 여러번 바뀌면서 메모리와 시간을 많이 잡아먹는 게 아닐까? 싶어서 answer
을 StringBuilder로 변경해보았다.
그 코드는 위에 올린 작성 코드!!
드디어 성고유ㅠㅠㅠㅠㅠ
심지어 속도가 첫번째보다 훠워어어어어얼씨이이인 빠르다...
StringBuilder가 진짜 빠르구나...
그렇다면 첫번째 코드도 StringBuilder로 전면교체 해본다면?!
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
class Solution {
public String solution(String X, String Y) {
StringBuilder answer = new StringBuilder();
StringBuilder xSb = new StringBuilder(X);
StringBuilder ySb = new StringBuilder(Y);
ArrayList<Integer> answerList = new ArrayList<>();
for(int i=0; i<xSb.length(); i++) {
String xNum = xSb.substring(i,i+1);
for(int j=0; j<ySb.length(); j++) {
if(xNum.equals(ySb.substring(j,j+1))) {
answerList.add(Integer.parseInt(xNum));
ySb.deleteCharAt(j);
break;
}
}
}
answerList.sort(Comparator.reverseOrder());
if(answerList.isEmpty()) {
return "-1";
} else {
boolean first = true;
for(int num : answerList) {
answer.append(num);
if(first == true && num == 0) {
break;
} else if(first == true) {
first = false;
}
}
}
return answer.toString();
}
}
응. 안돼. 돌아가.