알고리즘/프로그래머스 1단계

프로그래머스 - 숫자 짝꿍 - C++

게임만드는학생 2024. 7. 22. 14:25

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

#include <string>
#include <vector>

using namespace std;

string solution(string X, string Y) {
    string answer = "";
    vector<int> a(10,0);
    vector<int> b(10,0);
    
    for(int i=0;i<X.length();i++)
    {
        a[X[i]-'0']++;
    }
    for(int i=0;i<Y.length();i++)
    {
        b[Y[i]-'0']++;
    }
    
    for(int i=9;i>=0;i--)
    {
        if(a[i]>=1&&b[i]>=1)
        {
            int j = (a[i]>b[i])?b[i]:a[i];
            for(int k=0;k<j;k++)
                answer+=i+'0';
        }
    }
    if(answer=="")return "-1";
    for(int i=0;i<answer.length();i++)
    {
        if(answer[i]!='0')return answer;
    }
    return "0";
}

 

두 숫자로된 문자열에서 같은 숫자로 매칭되는 수는 짝꿍이 된다.

ex) a = "1313" , b = "3512" 면 

각 문자열에 1이 하나씩 있고 3이 하나씩 있기 때문에 1과 3은 짝꿍이 되고 a의 나머지 1과3은 b에 없기 때문에 짝꿍이 될 수 없다. 

따라서 짝꿍인 수들로 만들 수 있는 가장 큰 수인 31이 답이 된다.

예외조건은 짝꿍이 0만 있다면 0을 리턴, 짝이 없다면 -1을리턴한다. 

 

그래서 크기가 10인 벡터 두개를 만들어 각 문자열에 숫자들이 몇개씩 있는지 파악한다.

 

그리고

for(int i=9;i>=0;i--)
    {
        if(a[i]>=1&&b[i]>=1)
        {
            int j = (a[i]>b[i])?b[i]:a[i];
            for(int k=0;k<j;k++)
                answer+=i+'0';
        }
    }

여기서 짝을 가지고 가장 큰수를 만들게 된다.

 

가장큰수를 만들어야하기때문에 9부터 짝꿍이 있는지 확인한다. 둘다 1이상이면 짝이 있다는 뜻이므로

둘 중 더 작은 수에 대해서 for문을 돌며 answer에 숫자를 추가한다. 

 

마지막으로 예외사항을 처리하기위해 return하는 조건을 붙였다.