본문 바로가기

Algorithm/Programers - C++

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

 

Level. 1

 

문제

 

풀이

#include <string>
#include <vector>
#include <map>

using namespace std;

string solution(string X, string Y) {
    string answer = "";
    map<char, int> Xmap;
    map<char, int> Ymap;
    
    for(int i=0; i<X.size(); i++) Xmap[X[i]]++;
    for(int i=0; i<Y.size(); i++) Ymap[Y[i]]++;
    
    for(int i=9; i>=0; i--){
        int minVal = min(Xmap[i+'0'], Ymap[i+'0']);
        while(minVal > 0){
            minVal--;
            answer += to_string(i);
        }
    }
    
    if(answer == "") return "-1";
    if(answer[0] == '0') return "0";
    return answer;

}

 

해결과정

  1. 자료구조 map을 사용해 key값으로 0~9를 주고 문자열에 들어있는 숫자의 개수를 각각 세어주었다. 
  2. answer는 겹치는 숫자중 가장 큰 값이어야 하므로, 9부터 0까지 공통된 숫자를 탐색한다. 
  3. minVal은 공통된 숫자의 개수이다. minVal만큼 해당 숫자를 answer에 추가해 준다. 
  4. 숫자짝꿍이 없을경우 "-1"을, answer가 0으로 시작할 경우 (00, 000,... ) "0"을 리턴한다. 

 


 

다른 사람 풀이

#include <string>
#include <vector>
#include <map>

using namespace std;

string solution(string X, string Y)
{
    string answer="";
    map<char,int> mx;
    for(char c : X) mx[c]++;
    map<char,int> my;
    for(char c : Y) my[c]++;
    for(int i=9; i>=0; i--)
    {
        int num=min(mx[i+'0'],my[i+'0']);
        for(int j=0; j<num; j++) answer+=i+'0';
    }
    if(answer=="") answer="-1";
    else if(answer[0]=='0' && answer.size()>1) answer="0";
    return answer;
}