본문 바로가기
알고리즘/백준 문제풀이

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

by 잔디🌿 2022. 8. 1.

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

    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억인데 말이죠

     

    기억해야 할 것

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

    다른 사람 코드랑 다른 점

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