728x90
맞다고 생각한 코드가 자꾸 틀려서 원인을 찾다가 두 가지 오류를 찾았다.
첫째는 최댓값, 최솟값을 초기화할 때 최솟값 20억, 최댓값을 0으로 잡은 것이었다.
최댓값이 음수일 가능성을 배제해서 바로 오답처리 됐었다.
else if(oper_set[i-1]==3)
{
if(temp<0)
{
temp = temp * -1; //양수로 바꾼 후
temp = temp / arr[i]; //몫만 취하고
temp = temp * -1; //다시 음수로 바꾼다
}
temp = temp / arr[i];
}
두번째로는 if문 사용과정에서 else를 굳이 사용하지 않아도 되는 경우 항상 생략하다보니, else가 반드시 필요한 곳에서도 생략하고는 오랫동안 오류를 찾지 못했다.
안전장치로 else를 써주고, 초기화를 신경써서 해주는 등 작은 부분을 더 신경써줘야겠다.
#include <iostream>
#include <string>
using namespace std;
int n;
int arr[11];
int oper[4];
int oper_set[11];
bool visited[10]{0, }; // maximum blank = 10
int Min = 2000000000;
int Max = -2000000000;
void PlusRecursion(int, int);
void MinusRecursion(int, int);
void MultipleRecursion(int, int);
void DivideRecursion(int, int);
int main(void)
{
cin>>n;
for(int i =0; i< n; i++)
cin>>arr[i];
cin >> oper[0] >> oper[1] >> oper[2] >> oper[3]; // 0:+, 1:-, 2:*, 3: /.
int blank = n-1;
PlusRecursion(0, 0);
cout << Max << "\n" << Min;
}
void PlusRecursion(int idx, int depth)
{
if(depth == oper[0])
{
MinusRecursion(0,0);
return;
}
for(int i = idx; i < n-1; i++)
{
if(visited[i])
continue;
visited[i]=true;
oper_set[i] = 0;
PlusRecursion(i+1, depth+1);
visited[i]=false;
}
}
void MinusRecursion(int idx, int depth)
{
if(depth == oper[1])
{
MultipleRecursion(0,0);
return;
}
for(int i = idx; i< n-1; i++)
{
if(visited[i])
continue;
visited[i] = true;
oper_set[i] = 1;
MinusRecursion(i+1, depth+1);
visited[i] = false;
}
}
void MultipleRecursion(int idx, int depth)
{
if(depth == oper[2])
{
DivideRecursion(0,0);
return;
}
for(int i =idx; i < n-1; i++)
{
if(visited[i])
continue;
visited[i] = true;
oper_set[i] = 2;
MultipleRecursion(i+1, depth+1);
visited[i] = false;
}
}
void DivideRecursion(int idx, int depth)
{
if(depth == oper[3])
{
int temp=0;
if(oper_set[0]==0)
{
temp = arr[0]+arr[1];
}
else if(oper_set[0]==1)
{
temp = arr[0]-arr[1];
}
else if(oper_set[0]==2)
{
temp = arr[0]*arr[1];
}
else if(oper_set[0]==3)
{
temp = arr[0]/arr[1];
}
for(int i = 2; i< n; i++)
{
if(oper_set[i-1]==0)
{
temp = temp+arr[i];
}
else if(oper_set[i-1]==1)
{
temp = temp-arr[i];
}
else if(oper_set[i-1]==2)
{
temp = temp*arr[i];
}
else if(oper_set[i-1]==3)
{
//c++은 부호가 다른 수끼리 나누면 양수들을 나눈 몫에 음수를 취해준다.
temp = temp / arr[i];
}
}
if(temp<Min)
Min = temp;
if(temp> Max)
Max =temp;
return;
}
for(int i = idx; i<n-1; i++)
{
if(visited[i])
continue;
visited[i] = true;
oper_set[i] = 3;
DivideRecursion(i+1,depth+1);
visited[i] = false;
}
}
728x90
'Algorithm' 카테고리의 다른 글
[백준/C++] 9184 신나는 함수 실행 (S2) (0) | 2023.10.15 |
---|---|
[백준/C++] 24416 알고리즘 수업 - 피보나치 수1 (B1) (0) | 2023.10.15 |
[백준/C++] 2580 스도쿠 (G4) (0) | 2023.10.15 |
[백준/C++] 1967 트리의 지름 (G4) (0) | 2023.10.15 |
[백준/C++] 9663 N-Queen (G4) (0) | 2023.01.17 |