알고리즘 문제 연습

[프로그래머스] 숫자 짝꿍

codi-3 2024. 9. 20. 13:52

🔍문제


📊분석

  • 공통 포함되는 숫자들을 구한다.
  • 공통 포함된 숫자 중 가장 큰 정수를 답으로 넘겨준다.
  • 공통 포함된 숫자가 아무것도 없을 경우 답은 -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();
        }
    }
}

 

앞으로 메모리 와 런타임 효율성을 더 생각하는 알고리즘을 구현하는데 노력해야 될 거 같다.