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

다곰·2023년 1월 4일
0

우당탕탕 코테준비

목록 보기
24/98

✅ LV.1

✏️ 1차 솔루션

set 를 사용해서 존재하는 숫자를 표시하고 해당 숫자가 존재하면 짝궁이 있다고 판단해 string 에 추가하는 방식을 생각했으나, 존재여부를 판단하는 것이 아니라 짝궁을 만들어 주는 것이기 때문에 set 를 사용하는 방법은 적합하지 않음

✏️ 2차 솔루션

  1. X와 Y 중에 자리수가 더 긴 문자열을 탐색해서 각 자리에 해당하는 인덱스의 배열값을 늘려줌
    ➡️ 배열 초기화 필수
  2. X와 Y 중에 자리수가 짧은 문자열의 각 자리 인덱스 값이 0보다 크면 해당 인덱스 짝궁이 아직 없다는 것이므로 answer에 해당 자리 값을 string 으로 변환해 추가해줌
  3. 짝궁이 성립된 값들을 조합해서 최대값을 뽑아내야 하기 때문에 answer을 내림차순 정렬
  4. answer 값이 초기값일 경우, 짝궁이 없다는 것이므로 -1 return
  5. 내림차순 정렬했는데도 answer의 첫번째 값이 0이면 모든 값이 0이라는 뜻이므로 0을 return

📌 self feedback

X를 기준으로 탐색할 때, Y를 기준으로 탐색할 때를 나누어 코드를 짜면 중복되는 코드가 너무 많아서 비효율적이라고 생각함
마지막에 최대값을 산출하기 위해 sort 로 내림차순 정렬한 것도 대체할 방법이 필요함
set 를 사용하는 방법은 실패했지만 더 간결하고 효율적인 방법으로 대체하는 것이 필요함

✏️ 개선 솔루션

map 사용
X의 문자에 대한 map 과 Y의 문자에 대한 map 을 나눠서 map<char,int> m 형태로 저장
➡️ char 에는 특정 문자, int 에는 문자열에서 해당 문자가 등장한 횟수를 저장
최대값을 산출해야하기 때문에 9에서 시작해서 0까지 같은 key 값에 대해 몇 개를 갖고 있는지 계산해서 그만큼 해당 숫자를 answer에 저장

int num=min(mx[i+'0'],my[i+'0']);
➡️ 같은 key 값의 최소값이 숫자로 짝궁을 만들 수 있는 최소값
➡️ 숫자에 '0' 을 더하면 char 형으로 변환 가능

✏️ code

#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;
}
profile
다교미의 불꽃 에러 정복기

0개의 댓글