백준 14888번 연산자 끼워넣기 (삼성 SW역량테스트 기출)
https://www.acmicpc.net/problem/14888
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N;
static int[] a;
static int[] operator = new int[4];
static int maxValue = Integer.MIN_VALUE;
static int minValue = Integer.MAX_VALUE;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N =Integer.parseInt(br.readLine());
a = new int[N];
//수열정보
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=0; i<N; i++){
a[i]=Integer.parseInt(st.nextToken());
}
//연산자
st = new StringTokenizer(br.readLine());
for(int i=0; i<4; i++){
operator[i] = Integer.parseInt(st.nextToken());
}
makePattern(0, new int[N-1], operator);
System.out.println(maxValue);
System.out.println(minValue);
}
//연산자 패턴을 만든다
static void makePattern(int index, int[] pattern, int[] operator){
if(index==N-1) cal(pattern);
//+,-,x,/ 순서(0,1,2,3)
for(int i=0; i<4; i++){
if (0 < operator[i]) {
int[] nextOperator = operator.clone(); //남은 연산자의 개수
nextOperator[i]--;
pattern[index] = i;
makePattern(index+1, pattern, nextOperator);
}
}
}
static void cal(int[] pattern){
int value = a[0];
for(int i=0; i<pattern.length; i++){
value = calculate(value, pattern[i], a[i+1]);
}
maxValue = Math.max(maxValue, value);
minValue = Math.min(minValue, value);
}
static int calculate(int oprand1, int operator, int oprand2){
if(operator==0) return oprand1+oprand2;
if(operator==1) return oprand1-oprand2;
if(operator==2) return oprand1 * oprand2;
if(operator==3){
if(oprand1<0) return (-1)*((oprand1*-1) / oprand2);
else return oprand1/oprand2;
}
return 0;
}
}
틀렸던 부분
static int maxValue = 0;
static int maxValue = Integer.MIN_VALUE;
반례) 위의 결과대로 하면 결과가 하나뿐이고, 그 결과가 음수인 상황을 커버하지 못함.
팁 - 재귀함수에서 값을 보존하고 싶을 때
트리를 내려가면서 바뀌는 값이지만, A에서 B,C로 같은 값을 보내고 싶을 때
A
B C
...
value++;
recursion(value--);
...
'알고리즘 > 문제풀이' 카테고리의 다른 글
[DFS] 로또 (0) | 2019.03.31 |
---|---|
[브루트포스] 스타트와 링크 (0) | 2019.03.31 |
[시뮬레이션] 로봇청소기 (0) | 2019.03.31 |
[시뮬레이션] 연구실 (0) | 2019.03.30 |
[브루트포스] 테트로미노 (0) | 2019.03.26 |