본문 바로가기
알고리즘

Dessert

by Chars4785 2019. 5. 10.

문제


농부 존은 소들의 저녁식사 줄 세우는 새로운 방법을 개발 했다. N(1~15)마리의 소들을 순서대로 세 워놓은 후, 각 소들 사이에 +, - , . 셋 중 1가지가 써져있는 냅킨을 배치해서 최종 결과가 0 이 되게 해야 하는 것이다. 점(.)이 써져있는 냅킨을 통해 더 큰 수를 만들 수 있게 된다. 아래와 같은 경우를 보자. (ps .이 써져있는 냅킨은 '공백'이라고 생각하면 된다.) 1-2.3-4.5+6.7 이와 같은 배치는 1-23-45+67 을 나타낸다. 결과는 0 이다. 10.11은 1011 로 해석된다.

 

입력


첫 째 줄에는 소들의 수 N(1 ≤ N ≤ 15)이 입력된다.

 

출력


처음 20줄에 대해 가능한 20가지 답을 출력하는데, 사전 순으로 앞선 것을 출력한다. 순서는 +가 가장 앞서고 -와 . 이 순서대로 뒤따른다. 답이 20개 이하라면 가능한 답을 각 숫자와 문자 사이에 공백을 두고 출력한다. 모두 출력한다. 20개를 초과하는 경우 21번째 답부터는 출력하지 않는다. 마지막 줄에는 가능한 답의 총 가지수를 출력한다.

 

예제 입력

7

예제 출력

1 + 2 - 3 + 4 - 5 - 6 + 7 1 + 2 - 3 - 4 + 5 + 6 - 7 1 - 2 + 3 + 4 - 5 + 6 - 7 1 - 2 - 3 - 4 - 5 + 6 + 7 1 - 2 . 3 + 4 + 5 + 6 + 7 1 - 2 . 3 - 4 . 5 + 6 . 7 6

 

#include <iostream>
#include <string>

using namespace std;

int num;
char result[200];
char sign[3] ={'+','-','.'};
int tempNumber[200];
char calcu[200];
int count2=0;
bool flag =false;

void makeCa(int dp){

        if(dp == num-1){
                int temp=1;
                int inx =0;
                int sum=0;

                for(int i =2;i<=num;i++) // 2~7까지 돈다. 6개 돈다. 
                {
                        if(result[i-2] =='.'){
                                if(i <10){
                                        temp = temp*10 + i;
                                }else{ //i>10
                                        temp = temp*100 +i;
                                }
                                //temp+=to_string(i);

                                if(i==num){
                                        tempNumber[inx] =temp;
                                        break;
                                }
                                
                        }else{
                                tempNumber[inx] = temp;
                                calcu[inx++] = result[i-2]; 
                                temp=i;                                
                        }

                        if(i==num)
                                tempNumber[inx] = num;
                }

                sum = tempNumber[0];
                for(int i=0;i<inx;i++)
                {
                        if(calcu[i]=='+'){
                                sum +=tempNumber[i+1];
                        }else{
                                sum-=tempNumber[i+1];
                        }
                }
                
                if(sum ==0){
                        
                        if(flag){
                                count2++;
                                return ;
                        }

                        for(int i =0;i<num-1;i++)
                        {       
                                if(i==0)
                                {
                                        cout<<i+1<<" "<<result[i];
                                        continue;
                                }
                                cout<<" "<<i+1<<" "<<result[i];
                                if(i== num-2)
                                        cout<<" "<<i+2;
                        }
                        count2++;
                       
                        if(count2 ==20)
                        {
                                flag =true;
                                cout<<endl;
                                return ;
                        }
                       
                        cout<<endl;
                        return;
                }else return ;
              

        }

    // +,- 6 num=7 
    for(int i =0;i<3;i++)
    {
        result[dp] = sign[i];
        makeCa(dp+1);
   
    }

}

int main(){
    cin>>num;

    makeCa(0);

    cout<<count2<<endl;

}

'알고리즘' 카테고리의 다른 글

두 용액  (0) 2019.05.10
inequal  (0) 2019.05.10
Java 탑  (0) 2019.04.01
C++ division 재귀함수  (0) 2019.02.27
C++ Tobin  (0) 2019.02.18

댓글