프로그래머스 : 숫자 짝꿍

Digeut·2023년 10월 25일
0

프로그래머스

목록 보기
108/164

❔문제설명

두 정수 X, Y의 임의의 자리에서 공통으로 나타나는 정수 k(0 ≤ k ≤ 9)들을 이용하여 만들 수 있는 가장 큰 정수를 두 수의 짝꿍이라 합니다(단, 공통으로 나타나는 정수 중 서로 짝지을 수 있는 숫자만 사용합니다). X, Y의 짝꿍이 존재하지 않으면, 짝꿍은 -1입니다. X, Y의 짝꿍이 0으로만 구성되어 있다면, 짝꿍은 0입니다.

예를 들어, X = 3403이고 Y = 13203이라면, X와 Y의 짝꿍은 X와 Y에서 공통으로 나타나는 3, 0, 3으로 만들 수 있는 가장 큰 정수인 330입니다. 다른 예시로 X = 5525이고 Y = 1255이면 X와 Y의 짝꿍은 X와 Y에서 공통으로 나타나는 2, 5, 5로 만들 수 있는 가장 큰 정수인 552입니다(X에는 5가 3개, Y에는 5가 2개 나타나므로 남는 5 한 개는 짝 지을 수 없습니다.)
두 정수 X, Y가 주어졌을 때, X, Y의 짝꿍을 return하는 solution 함수를 완성해주세요.

⚠️제한사항

3 ≤ X, Y의 길이(자릿수) ≤ 3,000,000입니다.
X, Y는 0으로 시작하지 않습니다.
X, Y의 짝꿍은 상당히 큰 정수일 수 있으므로, 문자열로 반환합니다.

🤔아이디어

일단 X와 Y를 잘라서 배열을 만든 다음 각각 반복문을 통해서 둘의 값이 같은 경우 List에 담는 형태로 하면되지 않을까? 이렇게 만들어진 List를 역순으로 정렬한다음 다시 String형태로 변환하면 될것 같은데

❌틀린코드

import java.util.*;

class Solution {
    public String solution(String X, String Y) {
        String answer = "";
        
        String[] xArr = X.split("");
        String[] yArr = Y.split("");
        
        List<String> arr = new ArrayList<>();
        
        for(int i = 0 ; i < xArr.length ; i++){
            String word = xArr[i];
            for(int j = 0 ; j < yArr.length ; j++){
                if(word.equals(yArr[j])){
                    arr.add(word);
                    yArr[j] = " ";
                    xArr[i] = " ";
                    break;
                }
            }
        }
        
        if(arr.isEmpty()){
            answer = "-1";
        }
        
        arr.sort(Collections.reverseOrder());
        
        for(String a : arr){
            answer.append(a);
        }
        
        return answer.toString();
    }
}

🙄오류


answer에 담는 과정에서 뭔가 문제가 있는것 같아서 그대로 구글링해봄..


append의 방법은 String형태로는 가능하지 않은가본데.. StringBuilder을 만들어서 담아줘야하나?

참조 : https://onlyfor-me-blog.tistory.com/317 (StringBuilder 사용하는 이유 : 다수의 String을 더해야하는 경우 기능상의 오류가 생기나?)

❌틀린코드2

import java.util.*;

class Solution {
    public String solution(String X, String Y) {
        String answer = "";
        
        String[] xArr = X.split("");
        String[] yArr = Y.split("");
        
        List<String> arr = new ArrayList<>();
        
        for(int i = 0 ; i < xArr.length ; i++){
            String word = xArr[i];
            for(int j = 0 ; j < yArr.length ; j++){
                if(word.equals(yArr[j])){
                    arr.add(word);
                    yArr[j] = " ";
                    xArr[i] = " ";
                    break;
                }
            }
        }
        
        if(arr.isEmpty()){
            answer = "-1";
        }
        
        arr.sort(Collections.reverseOrder());
        
        StringBuilder stringBuilder = new StringBuilder();
        for(String a : arr){
            stringBuilder.append(a);
        }
        
        answer = stringBuilder.toString();
        
        return answer;
    }
}

🙄오류2


일단 0이 2개인 경우에 00으로 출력되는것부터 해결해봐야겠다..

❌틀린코드3

import java.util.*;

class Solution {
    public String solution(String X, String Y) {
        String answer = "";
        
        StringBuilder stringBuilder = new StringBuilder();
        
        String[] xArr = X.split("");
        String[] yArr = Y.split("");
        
        List<String> arr = new ArrayList<>();
        List<String> yList = new ArrayList<>(Arrays.asList(yArr));
        
        for(int i = 0 ; i < xArr.length ; i ++){
            String word = xArr[i];
            if(yList.contains(word)){
                arr.add(word);
                yList.remove(word);
            }
        }

        if(arr.isEmpty()){
            answer = "-1";
        } else {
            Collections.sort(arr, Collections.reverseOrder()); 
            // Sort in reverse order
            answer = String.join("", arr); 
            // Join the elements in the list into a string
            if (answer.startsWith("0")) {
                answer = "0"; 
            }
        }
    
        return answer;
    }
}

중복된 문자인 경우에는 공백으로 처리하지 않고 완전히 List에서 삭제하는 방향으로 수정하고, "00"으로 처리되는 경우 "0"으로 수정했다.

🙄오류3

코드가 너무 오래 걸리나보다... 이건 또 어떻게 해야하나...

💡코드풀이

class Solution {
    public String solution(String X, String Y) {
        String answer = "";
        
        StringBuilder sb = new StringBuilder();
        
        int[] xArr = new int[10];
        int[] yArr = new int[10];
        
        for(String x : X.split("")){
            xArr[Integer.parseInt(x)]++;
        }
        for(String y : Y.split("")){
            yArr[Integer.parseInt(y)]++;
        }
        
        for(int i = 9 ; i >= 0 ; i--){
            
            while(xArr[i]>0 && yArr[i]>0){
                sb.append(i);
                
                xArr[i]--;
                yArr[i]--;
            }
        }
        
        if(sb.toString().startsWith("0")){
            return "0";
        } else if(sb.toString().equals("")){
            return "-1";
        }
        
        answer = sb.toString();
        
        return answer;
    }
}

시간 초과의 문제때문에 통과를 하지 못해서 방법을 찾아보다가, 각각의 숫자를 인덱스로 잡는 배열을 만들어서 xArr과 yArr을 비교해서 둘다 값이 있다면 StringBuilder에 넣는 방법으로 바꿨다. for문을 반복해서 돌리면 시간초과가 되는 11~15케이스였다. 방법을 바꾸고도 시간이 오래 걸렸다.

profile
개발자가 될 거야!

0개의 댓글