[Programmers] 숫자 짝꿍
2023. 9. 14. 14:40ㆍComputer Sciences/Problem Solve
https://school.programmers.co.kr/learn/courses/30/lessons/131128
문제 설명
두 문자열에서 중복된 숫자를 가지고 가장 큰 숫자를 만들어야 한다. 이를 풀기 위해 각 문자열 별로 숫자의 등장 횟수를 저장할 배열을 만든다. 그리고 문자열을 순회하면서 숫자 등장 횟수를 체크한다. 그 다음에 9에서부터 내림차순으로 루프를 돌면서 x[i]와 y[i] 중 더 작은 값만큼, 즉 두 문자열에서 해당 문자가 중복된 횟수만큼 문자열에 추가한다. 만약 문자열의 길이가 0이라면 아무 문자도 중복되지 않은 것이므로 -1을 반환한다. 만약 문자열의 첫 문자가 0이라면 해당 문자열은 0이라는 뜻이다. 왜냐하면 9부터 내려왔기 때문에 첫 문자가 0인 경우는 0, 00, 000 등의 경우밖에 없기 때문이다. 이 경우 0을 반환한다. 그 외의 경우 여러 숫자로 구성된 문자열을 반환한다. 처음에는 Integer.parseInt(String.valueOf(sb.toString()))과 같은 방법으로 0을 제거했는데 문제 조건의 정답 문자열 길이가 최대 3백만이었다. 이는 곧 Integer나 Long으로 변경한다면 오버플로우 문제가 발생한다는 뜻이다. 따라서 이러한 방법으로 문제를 해결했다.
코드
class Solution {
public String solution(String X, String Y) {
int[] x = new int[10];
int[] y = new int[10];
for (int i = 0; i < X.length(); i++) {
x[X.charAt(i) - '0'] += 1;
}
for (int i = 0; i < Y.length(); i++) {
y[Y.charAt(i) - '0'] += 1;
}
StringBuilder sb = new StringBuilder();
for (int i = 9; i >= 0; i--) {
for (int j = 0; j < Math.min(x[i], y[i]); j++) {
sb.append(i);
}
}
if (sb.length() == 0) {
return "-1";
}
if (sb.charAt(0) == '0') {
return "0";
}
String answer = sb.toString();
return answer;
}
}
'Computer Sciences > Problem Solve' 카테고리의 다른 글
[Programmers] 숫자 카드 나누기 (0) | 2023.09.18 |
---|---|
[Programmers] 가장 큰 수 (0) | 2023.09.18 |
[Programmers] 대충 만든 자판 (0) | 2023.09.14 |
[Programmers] 행렬 테두리 회전하기 (0) | 2023.09.13 |
[Programmers] 정수 삼각형 (0) | 2023.09.12 |