본문 바로가기
코딩테스트 준비/프로그래머스

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

by 스테디코디스트 2023. 10. 17.
반응형

<문제 소개>


<소스 코드>

#include <string>
#include <vector>

using namespace std;

string solution(string X, string Y) 
{
    string answer = "";
    
    // 0~9 까지의 갯수를 담을 벡터
    vector<int> Xcount(10);
    vector<int> Ycount(10);
    
    // X의 각 숫자들의 갯수를 셈
    for(int i = 0; i < X.size(); i++)
    {
        int lastNum = X[i] - '0'; // char -> int로 변환
        Xcount[lastNum]++;
    }
    
    // Y의 각 숫자들의 갯수를 셈
    for(int i = 0; i < Y.size(); i++)
    {
        int lastNum = Y[i] - '0';
        
        // X에 없는 숫자는 세지 않음
        if(Xcount[lastNum] > 0)
        {
        	// X에 있는 숫자라면 갯수를 카운트하고, X의 갯수는 감소시킴
            Xcount[lastNum]--;
            Ycount[lastNum]++;
        }
    }
    
    // answer에 9부터 해당 갯수만큼 내림차순으로 넣어 가장 큰 수를 만들면서 저장
    for(int i = Ycount.size() - 1; i >= 0; i--)
    {
        for(int j = 0; j < Ycount[i]; j++)
        {
            answer += ('0' + i);
        }
    }
    
    if(answer.empty()) return "-1"; // 중복되는 수가 없어서 answer가 비어있는 경우
    if(answer[0] == '0') return "0"; // answer가 0으로만 이루어져서 가장 큰 수가 0인 경우
    
    return answer;
}

<풀이과정>

1. 0~9까지의 갯수를 담을 벡터 Xcount와 Ycount를 각각 10의 크기로 선언하여 각 인덱스에 따라 갯수를 나타내도록 함

2. X의 각 단어들을 반복하면서 해당 단어를 int로 변환하여 lastNum에 저장

3. Xcount에서 lastNum번째 인덱스의 갯수를 증가시켜 X의 각 단어에 맞는 숫자의 갯수를 카운트해줌

4. 반복이 끝난 뒤 Y에도 비슷한 과정을 반복하는데 lastNum을 구한 뒤에 Xcount에서 lastNum에 해당하는 숫자가 있는 경우에만 Ycount에 갯수를 세서 중복되는 숫자들만 카운트 해주고, 같은 경우에 Xcount의 갯수를 감소시켜 X에서 나온 갯수보다 더 많이 나오는 경우를 배제시켜 준다.

5. 위의 과정이 모두 끝나면 Ycount에는 X와 Y의 중복되는 숫자들과 해당 갯수들이 파악되어있다.

6. Ycount를 바탕으로 9부터 역순으로 내려가면서 answer에 해당 갯수만큼 해당 숫자를 반복하여 넣어준다.

7. 이때 숫자를 역순으로 넣어주기 때문에 자동으로 가장 큰 수가 된다.

8. 중복되는 수가 없어서 answer가 비어있는 경우에는 "-1"을 리턴해주고, 중복되는 수가 0으로만 구성되어 answer의 가장 큰 수가 0인 경우에는 "0"을 리턴해준다.


<코멘트>

for문을 두번 썼더니 시간초과가 났고, int로 바꿔서 풀었더니 범위 초과가 났다ㅋㅋㅋ

시간과 범위를 모두 생각해야해서 조금 까다로운 문제였다.


<제출결과>