문제 출처 : 숫자 짝궁
두 정수 x,y가 주어졌을 때 임의의 자리에서 공통으로 나타나는 정수들을 이용해서 만들 수 있는 가장 큰 정수를 두 수의 짝궁이라고 한다. 더 쉽게 이야기하면 문자열 형태로 주어진 두 정수에 존재하는 수를 추출해서 가장 큰 수를 만들어야 하는 문제이다.
이 문제에 제한사항은 굉장히 친절하게 잘 되어있어서 크게 고려할만한 사항이 존재하지 않는다.
어떤 방법으로 풀지 고민해보자, 잘 관찰을 해보면 두 정수에서 공통적으로 나오는 숫자를 카운팅 해준 후 큰 숫자로 만들어주면 끝나는 문제이다.
관찰결과 대략 4가지 방법으로 풀 수 있다고 생각하여 하나씩 접근해봤다.
풀이 순서는 다음과 같다.
class Solution {
StringBuilder sb = new StringBuilder();
int[] xArr = new int[10];
int[] yArr = new int[10];
/*
* 입력으로 들어오는 문자열 X, Y의 숫자 하나 하나를 xArr, yArr 인덱스에 빈도수를 체크하는 메소드
*/
private void countFrequency(String X, String Y) {
for (int i = 0; i < X.length(); i++) {
int element = Integer.parseInt(String.valueOf(X.charAt(i)));
xArr[element] += 1;
}
for (int i = 0; i < Y.length(); i++) {
int element = Integer.parseInt(String.valueOf(Y.charAt(i)));
yArr[element] += 1;
}
}
/*
* xArr, yArr 순회하면서 둘 다 공통적으로 가지고 있는 원소를 StringBuilder에 append 하는 메소드
*/
private void findCommonCharacters() {
for (int i = 0; i < 10; i++) {
/* 배열 x, y의 원소 둘다 0이거나, 둘 중 하나라도 1이상인 경우는 공통으로 나타나는 정수가 아님 */
while ((xArr[i] != 0 || yArr[i] != 0) && (xArr[i] != 0 || yArr[i] < 1) && (xArr[i] < 1 || yArr[i] != 0)) {
sb.append(i);
xArr[i] -= 1;
yArr[i] -= 1;
}
}
}
/*
* StringBuilder의 결과를 출력하는 메소드
*/
private String printAnswer() {
String answer = sb.reverse().toString();
if (answer.equals("")) {
return "-1";
}
if (answer.startsWith("0")) {
return "0";
}
return answer;
}
public String solution(String X, String Y) {
countFrequency(X, Y);
findCommonCharacters();
return printAnswer();
}
}