https://school.programmers.co.kr/learn/courses/30/lessons/131128
풀이
X와 Y가 가지고 있는 숫자들 중에서 중복된 숫자들만 찾으면 된다
우선 X를 한 글자씩 돌면서, 해당 숫자를 카운트 해준다
int[] count = new int[10]; // X가 가지고 있는 숫자 담을 배열
// X의 숫자 카운트
for (int i = 0; i < X.length(); i++) {
char c = X.charAt(i);
int n = c - '0';
count[n]++;
}
그 후, Y를 한 글자씩 돌면서, 해당 숫자를 X가 가지고 있는지 확인하고
X가 가지고 있다면, 카운트에서 값을 하나 빼준다
이러면 X와 Y가 중복으로 가지고 있는 숫자임을 찾은 셈이므로
중복으로 가지고 있는 숫자를 다른 카운트 배열에 저장해준다
int[] answer_count = new int[10]; // X와 Y가 가지고 있는 숫자 담을 배열
// Y가 X가 가지고 있는 숫자 가지고 있는지 카운트
for (int i = 0; i < Y.length(); i++) {
char c = Y.charAt(i);
int n = c - '0';
if (count[n] > 0) {
count[n]--;
answer_count[n]++;
}
}
이제 중복을 가지고 있는 카운트 배열의 맨 뒤에서 부터
해당 숫자가 카운트 되어 있다면 String에 하나씩 추가해 주면서
카운트가 0이 될때까지 빼주면 된다
StringBuilder sb = new StringBuilder();
// 카운트 배열에서 숫자 빼냄
for (int i = 9; i >= 0; i--) {
while (answer_count[i] > 0) {
sb.append(i);
answer_count[i]--;
}
}
마지막으로 예외처리를 해준다
아무 중복 숫자가 없는 경우는 answer의 길이가 0인 경우이고
중복 숫자가 0뿐인 경우는 answer의 맨 앞자리가 0인 경우이다
answer = sb.toString();
// 예외처리
if (answer.length() == 0) {
answer = "-1";
} else if (answer.charAt(0) == '0') answer = "0";
전체 코드
class Solution {
int[] count = new int[10]; // X가 가지고 있는 숫자 담을 배열
int[] answer_count = new int[10]; // X와 Y가 가지고 있는 숫자 담을 배열
public String solution(String X, String Y) {
String answer = "";
StringBuilder sb = new StringBuilder();
// X의 숫자 카운트
for (int i = 0; i < X.length(); i++) {
char c = X.charAt(i);
int n = c - '0';
count[n]++;
}
// Y가 X가 가지고 있는 숫자 가지고 있는지 카운트
for (int i = 0; i < Y.length(); i++) {
char c = Y.charAt(i);
int n = c - '0';
if (count[n] > 0) {
count[n]--;
answer_count[n]++;
}
}
// 카운트 배열에서 숫자 빼냄
for (int i = 9; i >= 0; i--) {
while (answer_count[i] > 0) {
sb.append(i);
answer_count[i]--;
}
}
answer = sb.toString();
// 예외처리
if (answer.length() == 0) {
answer = "-1";
} else if (answer.charAt(0) == '0') answer = "0";
return answer;
}
}