N

(프로그래머스 c++) 숫자 짝꿍 본문

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

(프로그래머스 c++) 숫자 짝꿍

naeunchan 2025. 10. 8. 16:08
728x90
반응형

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

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

map을 이용한 문제 풀이.

 

주어진 두 string x,y를 순회해서 숫자가 몇개씩 존재하는지 x,y map에 각각 저장하는 방식으로 생각했다.

 

문제풀이)

1. x,y string을 순회하면서 카운팅 할 xMap, yMap을 fillMap 함수를 통해서 각 맵에 카운팅을 한다.

2. 맵을 모두 채웠으면 0~9까지의 수를 채울 수 있는 만큼 answer에 채우면 된다.

xVal과 yVal은 각 맵에 저장되어 있는 숫자의 카운트를 뜻한다.

즉, key = i(0 ~ 9), value = i에 해당하는 value가 된다.

 

xVal과 yVal이 모두 0보다 크면 answer에 추가할 수 있는 첫번째 조건이 된다.

answer을 채울 수 있는 조건은 xVal과 yVal 중 최소값 만큼 채울 수 있다.

to_string()을 이용해서 현재 i 값을 answer에 min(xVal, yVal) 만큼 채워준다.

또한, 해당 if문에는 isGreaterThanZero 라는 bool 변수를 업데이트 한다.

이 변수는 answer가 0밖에 없는지 확인하는 flag다.

 

for문을 모두 순회하면 early return을 할 수 있는지 확인한다.

isGreaterThanZero가 false 인 경우, "0" or "-1"을 리턴할 수 있다.

answer의 size를 확인해서 0인 경우 "-1"을 리턴, 그렇지 않다면 "0"을 리턴해준다.

 

early return의 조건이 아니라면 현재 채워진 answer을 reverse 해서 값을 리턴하면 답이 된다.

 

#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <cmath>

using namespace std;

void fillMap(string s, map<int, int>& m) {
    for (auto i = 0; i < s.size(); i++) {
        auto num = s[i] - '0';
        
        if (m.find(num) == m.end()) {
            m[num] = 1;
        } else {
            m[num]++;
        }
    }
}

string solution(string X, string Y) {
    string answer = "";
    bool isGreaterThanZero = false;
    map<int, int> xMap;
    map<int, int> yMap;
    
    fillMap(X, xMap);
    fillMap(Y, yMap);
    
    for (int i = 0; i <= 9; ++i) {
        int xVal = (xMap.find(i) != xMap.end()) ? xMap[i] : 0;
        int yVal = (yMap.find(i) != yMap.end()) ? yMap[i] : 0;
        
        if (xVal > 0 && yVal > 0) {
            int xyMin = min(xVal, yVal);
            
            for (int j = 0; j < xyMin; ++j) {
                answer += to_string(i);
            }
        
            isGreaterThanZero = i > 0;
        }
    }
    
    if (!isGreaterThanZero) {
        return answer.size() ? "0" : "-1";
    }
    
    reverse(answer.begin(), answer.end());
    
    return answer;
}
728x90
반응형