C# 14888번 연산자 끼워넣기

2022. 1. 17. 17:02C#/[백준] 백트래킹

문제

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _7
{
    internal class Program
    {
        //첫째줄 입력 받는 배열
        static int N;
        //둘째 줄 입력 받는 배열
        static string An;
        //셋째 줄 입력 받는 배열
        static string operators;
        //계산할 값 저장 배열
        static string[] AnArray = new string[N];
        //int형으로 형 변환한 계산할 값 저장 배열
        static int[] AnArray2 = new int[N];
        //연산자 배열
        static string[] operatorsArray1 = new string[4];
        //int형으로 형 변환한 연산자 배열
        static int[] operatorsArray2 = new int[4];

        //산술연산자 저장공간
        static int[] oper = new int[10];
        //연산되어 나온 값
        static int output;
        //사칙연산 기호의 총갯수
        static int sum;
        //최소
        static int min = 1000000000;
        //최대
        static int max= -1000000000;

        //사칙연산 함수
        public static void ArithmeticOperation(int i)
        {
            if (oper[i] == 0) //덧셈
            {
                output = output + AnArray2[i + 1];
            }
            else if (oper[i] == 1) //뺄셈
            {
                output = output - AnArray2[i + 1];
            }
            else if (oper[i] == 2) //곱셈
            {
                output = output * AnArray2[i + 1];
            }
            else if (oper[i] == 3) //나눗셈
            {
                if (output < 0)
                    output = (-1) * ((output * (-1)) / Convert.ToInt32(AnArray[i + 1]));
                else
                    output = output / Convert.ToInt32(AnArray2[i + 1]);
            }
        }

        //재귀함수
        public static void Operator(int count)
        {
            if (count == sum)
            {
                output = AnArray2[0];
                for (int i = 0; i < AnArray2.Length - 1; i++)
                {
                    //사칙연산
                    ArithmeticOperation(i);
                }
				//min, max 저장
                if (output < min)
                    min = output;
                if (output > max)
                    max = output;
                    
				//초기화
                output = 0;
            }
            else
            {
                for (int i = 0; i < 4; i++)
                {
                    if (Convert.ToInt32(operatorsArray2[i]) == 0)
                    {
                        continue;
                    }
                    else
                    {
                        oper[count] = i;
                        operatorsArray2[i] = (Convert.ToInt32(operatorsArray2[i]) - 1);
                        
                        //재귀 호출
                        Operator(count + 1);
                        
                        operatorsArray2[i] = (Convert.ToInt32(operatorsArray2[i]) + 1);
                    }
                }
            }
        }
        static void Main(string[] args)
        {
        
            N = Convert.ToInt32(Console.ReadLine());
            An = Console.ReadLine();
            operators = Console.ReadLine();
            AnArray = An.Split(' ');
            AnArray2 = new int[N];
            operatorsArray1 = operators.Split(' ');
            
			//데이터 전처리         
            for (int i = 0; i < AnArray.Length; i++)
            {
                AnArray2[i] = Convert.ToInt32(AnArray[i].ToString());
            }
            //데이터 전처리
            for (int i = 0; i < operatorsArray1.Length; i++)
            {                
                operatorsArray2[i] = Convert.ToInt32(operatorsArray1[i].ToString());
                sum += Convert.ToInt32(operatorsArray1[i].ToString());
            }
            
            //함수 시작
            Operator(0);
            
            //출력
            Console.WriteLine(max);
            Console.WriteLine(min);
        }
    }
}

코드 설명 :

연산자를 저장할 배열을 만든다. 예를 들어 0 0 0 1 이 들어온다면 0일 경우엔 연산자가 없다는 의미이므로 넘어가고 0이 아닐경우에는 해당 인덱스를 하나씩 추출해 사용하고 해당 칸에 -1을 하여 0이 되게끔 반복한다. 

 if (Convert.ToInt32(operatorsArray2[i]) == 0)
{
    continue;
}
else
{
    oper[count] = i;
    operatorsArray2[i] = (Convert.ToInt32(operatorsArray2[i]) - 1);

    //재귀 호출
    Operator(count + 1);

    operatorsArray2[i] = (Convert.ToInt32(operatorsArray2[i]) + 1);
}

모든 연산자를 추출했을 경우 해당하는 연산자 기능을 수행한다.

//사칙연산 함수
public static void ArithmeticOperation(int i)
{
    if (oper[i] == 0) //덧셈
    {
        output = output + AnArray2[i + 1];
    }
    else if (oper[i] == 1) //뺄셈
    {
        output = output - AnArray2[i + 1];
    }
    else if (oper[i] == 2) //곱셈
    {
        output = output * AnArray2[i + 1];
    }
    else if (oper[i] == 3) //나눗셈
    {
        if (output < 0)
            output = (-1) * ((output * (-1)) / Convert.ToInt32(AnArray[i + 1]));
        else
            output = output / Convert.ToInt32(AnArray2[i + 1]);
    }
}

 

연산하는 부분에서 좀더 깔끔하게 할 수 있을거 같은데 그 부분이 아쉽다.

 

GitHub - CheongHo-Lee/Algorithm-Study: Algorithm Study For Coding Test

Algorithm Study For Coding Test. Contribute to CheongHo-Lee/Algorithm-Study development by creating an account on GitHub.

github.com

 

'C# > [백준] 백트래킹' 카테고리의 다른 글

C# 14889번 스타트와 링크  (0) 2022.01.17
C# 9663번 N-Queen  (0) 2022.01.17
C# 15652번 N과 M(4)  (0) 2022.01.17
C# 15651번 N과 M(3)  (0) 2022.01.17
C# 15650번 N과 M(2)  (0) 2022.01.17