알고리즘/문제풀이

[시뮬레이션] 연산자 끼워넣기

lipnus 2019. 3. 31. 15:08
반응형

백준 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