🔍문제
📊분석
- 공통 포함되는 숫자들을 구한다.
- 공통 포함된 숫자 중 가장 큰 정수를 답으로 넘겨준다.
- 공통 포함된 숫자가 아무것도 없을 경우 답은 -1.
- 공통 포함된 숫자가 0일 경우 답은 0.
✏️ 풀이
import java.util.*;
class Solution {
public String solution(String X, String Y) {
String answer = "";
String minString;
String maxString;
int xlen = X.length();
int ylen = Y.length();
List<String> lst = new ArrayList<>();
if(xlen!=ylen){
if(xlen< ylen){
minString = X;
maxString = Y;
}else{
minString = Y;
maxString = X;
}
}else{
minString = X;
maxString = Y;
}
for(int i =0; i<minString.length();i++){
String x = Character.toString(minString.charAt(i));
if(maxString.contains(x)){
maxString = maxString.replaceFirst(x, "x");
lst.add(x);
}
}
Collections.sort(lst, Collections.reverseOrder());
for(String each : lst){
if(each.equals("0")&& answer =="0"){
continue;
}else{answer += each;}
}
if(lst.isEmpty()){
answer = "-1";
}
return answer;
}
}
처음 시도를 했을떄 for loop을 최소 하기 위해 두 String 값 X와 Y 중 더 작은 길이의 값을 forloop을 돌아 같이 포함하는 숫자를 lst ArrayList에 저장해 주었다. 그 뒤 lst를 내림차순으로 정렬해 준 다음 또다시 forLoop을 돌아 정답의 값이 0일 경우에는 값을 0으로 유지하고 아닐 경우 정답에 값을 더해주었다.
하지만 forloop 이너무 많은지 runtime에러가 나서 테스트 통과에는 실패했다.
⚒️개선된 코드
class Solution {
public String solution(String X, String Y) {
StringBuilder answer = new StringBuilder(); // 결과를 저장할 StringBuilder 객체
int[] x = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // X 문자열에서 각 숫자(0-9)의 등장 횟수를 저장할 배열
int[] y = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // Y 문자열에서 각 숫자(0-9)의 등장 횟수를 저장할 배열
// X 문자열에서 각 숫자의 등장 횟수를 카운팅
for (int i = 0; i < X.length(); i++) {
x[X.charAt(i) - 48] += 1; // 문자 '0'의 아스키 값은 48이므로, 48을 빼서 숫자로 변환
}
// Y 문자열에서 각 숫자의 등장 횟수를 카운팅
for (int i = 0; i < Y.length(); i++) {
y[Y.charAt(i) - 48] += 1; // 위와 동일하게 '0'의 아스키 값에서 48을 빼서 숫자로 변환
}
// 9부터 0까지 숫자에 대해 두 배열에서 공통으로 등장하는 숫자들을 찾아 결과에 추가
for (int i = 9; i >= 0; i--) {
// X와 Y에서 등장하는 숫자의 최소 등장 횟수만큼 결과에 추가
for (int j = 0; j < Math.min(x[i], y[i]); j++) {
answer.append(i); // 공통으로 등장하는 숫자를 결과 문자열에 추가
}
}
// 만약 결과가 비어 있다면(공통으로 등장하는 숫자가 없다면) "-1" 반환
if ("".equals(answer.toString())) {
return "-1";
}
// 결과의 첫 번째 문자가 '0'이면(즉, 공통으로 등장한 숫자가 모두 0일 경우) "0" 반환
else if (answer.toString().charAt(0) == 48) {
return "0";
}
// 그 외의 경우, 만들어진 숫자 문자열 반환
else {
return answer.toString();
}
}
}
앞으로 메모리 와 런타임 효율성을 더 생각하는 알고리즘을 구현하는데 노력해야 될 거 같다.
'알고리즘 문제 연습' 카테고리의 다른 글
[프로그래머스] 바탕화면 정리 (0) | 2024.10.04 |
---|---|
[프로그래머스] 성격 유형 검사하기 (0) | 2024.09.30 |
[프로그래머스] 옹알이(2) (0) | 2024.09.03 |
[프로그래머스] 기사단원의 무기 (0) | 2024.08.27 |
[프로그래머스,Java]2016년 (0) | 2024.08.26 |