(C++ : Quize) Plus Minus

Posted by : at

Category : Cpp   Quize


Q

숫자사이에 +, -를 넣어서 0이될수 있는지 판별
만약 두 개 이상의 가능한 조건이 있다면 마이너스가 많은 쪽이 정답

Input: 199
Output: not possible
Input: 26712
Output: -+--

Write Code

#include <iostream>
#include <string>
using namespace std;

string PlusMinus(int num) {
  return ""; 
}

int main(void) { 
  cout << PlusMinus(199);
  return 0;
}

A

재귀적으로 해결해야한다.
필요한 변수는

  • 총 합 : 0이 되었는지 확인용
  • 원본 숫자 : 재귀를 돌리려면 필요
  • 현재 마이너스 개수 : 최대 마이너스 개수 확인용
  • 최대 마이너스 개수 : 현재 마이너스 개수와 비교용
  • 리턴 : 리턴용
  • 리턴 템프 : 최대 마이너스 갱신시 리턴 템프를 리턴으로 변환

A - Code

#include <iostream>
#include <string>
using namespace std;

void helper(int sum, string &source, string &res, string temp, int minus, int &max) {
  if(temp.size()==source.size()-1) {        // 모든 기호가 다 들어감.
    if(sum == 0 &&          // 모든 합이 0이고
        minus > max) {      // 최대 마이너스 개수를 체크(두 번째 조건임)
      max = minus; 
      res = temp;
    }
    return;
  }

  // 최대 -가 우선되기에 -를 먼저 검사
  temp.push_back('-');         
  int sum1 = sum - (source[temp.size()] - '0');
  helper(sum1, source, res, temp, minus+1, max);
  temp.pop_back();

  temp.push_back('+');
  int sum2 = sum + (source[temp.size()] - '0');
  helper(sum2, source, res, temp, minus, max);
  return; 
}

/*
145라 가정 분기가 된다 생각하면 좀 쉽다

''  -> '-'  -> '--'  --> 이걸 검사 후 조건에 맞으면 max, res에 값을 갱신한다
            -> '-+'
    -> '+'  -> '+-'
            -> '++'
*/

string PlusMinus(int num) {
  string no = "not possible";
  string source = to_string(num);
  if(source.size() == 1) return no; 
  if(source.empty()) return no;
  string res = "";
  string temp = "";
  int sum = source[0] - '0';
  int max = 0; 
  helper(sum, source, res, temp, 0, max);
  if (res == "") return no;
  else return res; 
}

int main(void) { 
   
  // keep this function call here
  cout << PlusMinus(coderbyteInternalStdinFunction(stdin));
  return 0;
    
}

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links