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

당당·2023년 5월 18일
0

프로그래머스

목록 보기
112/245

https://school.programmers.co.kr/learn/courses/30/lessons/131128

📔문제

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

예를 들어, X = 3403이고 Y = 13203이라면, XY의 짝꿍은 XY에서 공통으로 나타나는 3, 0, 3으로 만들 수 있는 가장 큰 정수인 330입니다. 다른 예시로 X = 5525이고 Y = 1255이면 XY의 짝꿍은 XY에서 공통으로 나타나는 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의 짝꿍은 상당히 큰 정수일 수 있으므로, 문자열로 반환합니다.


📝입출력 예

XYresult
"100""2345""-1"
"100""203045""0"
"100""123450""10"
"12321""42531""321"
"5525""1255""552"

입출력 예 #1

X, Y의 짝꿍은 존재하지 않습니다. 따라서 "-1"을 return합니다.

입출력 예 #2

X, Y의 공통된 숫자는 0으로만 구성되어 있기 때문에, 두 수의 짝꿍은 정수 0입니다. 따라서 "0"을 return합니다.

입출력 예 #3

X, Y의 짝꿍은 10이므로, "10"을 return합니다.

입출력 예 #4

X, Y의 짝꿍은 321입니다. 따라서 "321"을 return합니다.

입출력 예 #5

지문에 설명된 예시와 같습니다.


🧮알고리즘 분류

  • 시뮬레이션
  • 구현

📃소스 코드

import java.util.Arrays;
class Solution {
    public String solution(String X, String Y) {
        String answer = "";
        StringBuilder output=new StringBuilder();
        
        int lenx=X.length();
        int leny=Y.length();
        int tofindzero=0;
        
        
        int[] xx=new int[10];
        int[] yy=new int[10];
        
        for(int i=0;i<lenx;i++){
            int n=X.charAt(i)-'0';
            xx[n]+=1;
        }
        for(int i=0;i<leny;i++){
            int n=Y.charAt(i)-'0';
            yy[n]+=1;
        }
        //xx[0]=2, xx[1]=1; 그 외 나머지는 다 0
        //yy[2]=1, yy[3]=1 .. 
        
        for(int i=0;i<10;i++){
            if(xx[i]==yy[i] && xx[i]!=0 &&yy[i]!=0){
                output.append(String.valueOf(i).repeat(xx[i]));
                tofindzero+=i;
            }
            else if(xx[i]<yy[i] && xx[i]!=0){
                output.append(String.valueOf(i).repeat(xx[i]));
                tofindzero+=i;
            }
            else if(xx[i]>yy[i] && yy[i]!=0){
                output.append(String.valueOf(i).repeat(yy[i]));
                tofindzero+=i;
            }
        }
        String str=output.toString();
    
        if(str.length()==0){
            answer="-1";
        }
        else if(tofindzero==0){
            answer="0";
        }
        else{
            char[] temp=str.toCharArray();
            Arrays.sort(temp);
            
            StringBuilder sb=new StringBuilder(new String(temp));
            answer=sb.reverse().toString();
        }
        return answer;
    }
}

📰출력 결과


📂고찰

처음에는 문자열의 길이를 비교해서 만약 XY보다 작으면 X길이만큼 반복해서 Y에 값이 있으면 그 값을 바꾸고 answer에 추가했었다. => 바로 시간초과

두번째는 위랑 비슷하지만, replace를 이용했다. 어쨌거나 시간복잡도가 O(n)--replace이기 때문에 또 시간초과가 발생했다.

그래서 마지막으로는 크기가 10인 배열을 만들어서 0부터 9까지의 갯수를 각각 배열에 저장하고 그 크기가 같으면(0은 아니어야 함) output에 그 i(인덱스)를 저장해주고 마지막에 answer로 넣어주었다.

profile
MySQL DBA 신입 지원

0개의 댓글