알고리즘/백준 문제풀이

백준 [자바 java] 14888번 : 연산자 끼워넣기

잔디🌿 2022. 8. 1. 15:48

이 문제는 숫자 사이사이에 주어진 연산자를 끼워 넣어 최댓값과 최솟값을 구하는 문제입니다. 특이한 점은 연산자 우선순위를 무시한다는 점이었습니다.

import java.io.*;
import java.util.*;



class Main {
	static int cnt = 0;
	static int[] k ;
	static boolean[] visit;
	static int[] po;
	static int max = -1000000000;
	static int min = 1000000000;
	static int[] l ;
	
	
	static void arr2() {
		int i;
		int hap = k[0];
		
		for(i = 0; i<cnt ;i++) {
			
			
			
			if(l[po[i]] == 1) {
				hap+=k[i+1];
			}
			else if(l[po[i]] == 2) {
				hap-=k[i+1];
			}
			else if(l[po[i]] == 3) {
				hap*=k[i+1];
			}
			else if(l[po[i]] == 4) {
				hap/=k[i+1];
			}
		
			
		}
		
		max = Math.max(hap, max);
		min = Math.min(hap, min);
		
	}
	
	static void arr(int i) {
		
		for(int j = 0;j<cnt;j++) {
			
			if(visit[j] == false) {
				
				po[i] = j;
				if(i == cnt-1) {
					
					arr2();
				}
				else {
					visit[j] = true;
					arr(i+1);
					visit[j] = false;
				}
			}
			
		}
	}
	
	public static void main(String[] arg) throws IOException {
		
		BufferedReader br = new BufferedReader(new InputStreamReader (System.in));
		
		StringTokenizer st;
		
		
		int n = Integer.parseInt(br.readLine());
		
		st = new StringTokenizer(br.readLine());
		
	    k = new int[n];
	    visit = new boolean[n];
		po = new int[n];
		
		int i;
		for(i = 0;i<n;i++) {
			k[i] = Integer.parseInt(st.nextToken());
		}
		 
		l = new int[12];
	    
	    int now;
	    int j;
	    st = new StringTokenizer(br.readLine());
	    
	    for(i = 1;i<=4;i++) {
	    	now = Integer.parseInt(st.nextToken());
	    	
	    	for(j = 1;j<=now;j++) {
	    	l[cnt] = i;
	    	cnt++;
	    	}
	    }
	   
		arr(0);
		System.out.println(max);
		System.out.println(min);
		 
	
		
}

}

숫자, 연산자를 입력받고 연산자는 배열을 이용해서 가능한 경우의 수 만큼 배치해 주었습니다. 

8핀 문제를 풀었던 경험을 바탕으로 풀었는데 이런 문제는 언제 봐도 헷갈립니다ㅜㅜ

처음에는 재귀함수로 풀면 오버플로우 날까 봐 걱정되었는데 예상외로 굉장히 빨리 돌아갔어요! 앞으로는 재귀는 쓰면 안 된다 라는 생각을 조금은 버려도 될 것 같아요.

 

실수 1.

i를 1부터 시작하기도 하고 0부터 시작하기도 해서 여기저기서 막 꼬여서 답이 이상하게 나왔었습니다.

실수 2.

max값을 0으로 했습니다ㅜㅜ 다른 문제는 거의 0부터 시작하니까 무의식적으로 0보다 작은 값은 안 나올 것이라고 생각했나 봐요 사실 -10억인데 말이죠

 

기억해야 할 것

최댓값, 최솟값 얼마인지 똑바로 보고 초기값 설정하기!

다른 사람 코드랑 다른 점

=-*/ 네 가지 배열을 두고 없애(?) 가면서 구한다.