C# 14888번 연산자 끼워넣기
2022. 1. 17. 17:02ㆍ코딩테스트 문제 풀이/[백준] 백트래킹
728x90
반응형
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
728x90
반응형
'코딩테스트 문제 풀이 > [백준] 백트래킹' 카테고리의 다른 글
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 |