Level1

 

 문제

두 정수 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 result
"100" "2345" "-1"
"100" "203045" "0"
"100" "123450" "10"
"12321" "42531" "321"
"5525" "1255" "552"

 

 

 풀이

 

아래 처럼 단순히 두개의 string 배열을 다 접근하게 되면은 시간초과가 되어버린다.

	if( Y.size() > X.size() ){
        string temp;
        temp = X;
        X = Y;
        Y = temp;
	}

	for ( int i = 0; i <= 9; ++i){
        while ( X.find(to_string(i))  != string::npos && Y.find(to_string(i))  != string::npos ){
            X.replace(X.find(to_string(i)), 1, "");
            Y.replace(Y.find(to_string(i)), 1, "");
            answer.append(to_string(i));
        }
        
	}
    
    
//     for( int i = 0 ; i < Y.size(); ++i){ 
//         if ( X.find(Y[i]) != string::npos){
//             X.replace(X.find(Y[i]), 1, "");
//             string a;
//             a += Y[i];
//             answer.append(a);
//         }       
//     }

    sort(answer.begin(),answer.end());
    reverse(answer.begin(),answer.end());
 
    if ( answer.empty()){
     answer = "-1";
    }
    else if (answer[0] == '0' ){
        answer = "0";
    }

시간초과가 되어 방식을 바꾸어서 접근을 했다.

먼저 각 스트링 배열을 정렬하여 접근하기로했다.

한번 돌면서 두개를 동시에 체크하기로했다.

#include <string>
#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

string solution(string X, string Y) {
    
    string answer = "";

    sort(X.begin(),X.end());
    sort(Y.begin(),Y.end());
    
    int indexX = 0;
    int indexY = 0;

    int loopState = true;
    
    while ( loopState ){
        
        if ( (X.size()<=indexX) || (Y.size()<=indexY)){
            break;
        }
        
        if ( X[indexX] == Y[indexY] ){
            answer+= X[indexX];
            ++indexX;
            ++indexY;
        }
        
        else if ( X[indexX] > Y[indexY] ){
            ++indexY;
        }
        
        else if ( X[indexX] < Y[indexY] ){
            ++indexX;
        }

    }

    sort(answer.begin(),answer.end());
    reverse(answer.begin(),answer.end());

    if ( answer.empty()){
     answer = "-1";
    }
    else if (answer[0] == '0' ){
        answer = "0";
    }
    
    return answer;
}

 

 

 

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

+ Recent posts