프로그래머스/Lv.1

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

MINU.SHINNNN 2023. 11. 1. 00:37

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

 

프로그래머스

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

programmers.co.kr

풀이

두 문자열 X, Y가 주어졌을 때, 공통 문자를 찾은 후 가장 큰 문자열로 변환하여 리턴하는 문제입니다.

 

공통 문자열을 찾기위해 map자료구조를 통해 해싱하는 방법을 사용했습니다. 

X, Y 문자열에서 문자 갯수 카운트용 변수 x_um, y_um 을 선언하고 각 문자마다 등장한 갯수를 기록해둡니다.

다음으로, x_um에 기록된 문자가 y_um 에서도 등장했다면 더 적은 등장횟수만큼 answer에 추가해줍니다. 이때, 어차피 공통 문자를 찾는 것이므로 x_um을 순회하든, y_um을 순회하든 상관없습니다.

 

순회가 종료된 후, answer가 비어있다면 짝꿍이 존재하지 않으므로 "-1"을 리턴해줍니다. 비어있지 않다면, 리턴해야 하는 값은 가장 큰 수여야 하므로 sort 를 사용해 내림차순으로 정렬해줍니다. 이 때, 가장 앞에 '0'이 존재한다면 '0'을 리턴해야 함에 유의합니다.

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

using namespace std;

string solution(string X, string Y) {
    string answer = "";
    unordered_map<char, int> x_um;
    unordered_map<char, int> y_um;
    // 공통 문자 찾기 & 갯수 기록
    for (auto i:X) x_um[i]++;
    for (auto i:Y) y_um[i]++;
    
    for (auto i:x_um) {
        // X에서 나타난 것이 Y에도 있다면 더 적은 숫자만큼 기록
        if (y_um[i.first]) {
            if (i.second < y_um[i.first]) {
                for (int cnt = 0; cnt < i.second; cnt++)
                    answer+= i.first;
            }
            else {
                for (int cnt = 0; cnt < y_um[i.first]; cnt++) 
                    answer+= i.first;
            }
        }
    }
    // 짝꿍이 없는 경우
    if (answer == "")
        return "-1";
    
    // 내림차순 정렬
    sort(answer.begin(), answer.end(), greater<>());
    // 처음 나타난 수가 0이면 "0" 리턴
    if (answer[0] == '0')
        return "0";
    return answer;
}