본문으로 바로가기
반응형

 

관련글

 

완전 탐색 관련 포스팅은 여기를 참조

 

 

1. 개요

 

문제의 링크는 여기를 참조

 

문제의 내용은 아래의 더보기를 클릭하여 참조

 

N개의 수와 N-1개 이상, 4N개 미만의 연산자가 주어졌을 때, 연산을 수행하는 경우에 따라 최소/최대값을 구하는 문제

 

 

2. 풀이

 

숫자 N개가 주어질 때, 4N이하의 연산자가 주어진다면 연산자를 어떻게 배치했을 때 결과가 최대 / 최소값이 되는 지를 구하는 문제이므로 완전 탐색을 통해 해결할 수 있다.

단순히 재귀를 통해 전체 숫자가 N개이므로 N-1개의 연산자를 각 위치에 모두 대입하여 그 결과를 구한 뒤 출력하면 해결할 수 있다.

 

 

3. 코드

 

아래의 코드를 통해 정답을 알아보자.

 

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

public class Main{
    static int n;
    static int[] num;
    static int[] op = new int[4]; // 0(+), 1(-), 2(*), 3(/)
    static int max = Integer.MIN_VALUE;
    static int min = Integer.MAX_VALUE;
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // ***************** 주어진 숫자, 연산자 저장 ********************
        n = Integer.parseInt(br.readLine());

        StringTokenizer st = new StringTokenizer(br.readLine());
        num = new int[n];
        for(int i=0; i < n; i++){
            num[i] = Integer.parseInt(st.nextToken());
        }

        st = new StringTokenizer(br.readLine());
        for(int i=0; i < 4; i++){
            op[i] = Integer.parseInt(st.nextToken());
        }
        // ***************** 주어진 숫자, 연산자 저장 완료 ********************


        // ***************** 완전 탐색으로 결과값 도출 ********************
        bruteForce(1, num[0]);
        StringBuilder sb = new StringBuilder();
        sb.append(max).append("\n").append(min);
        System.out.println(sb);
        // ***************** 완전 탐색으로 결과값 도출 완료 ********************

        br.close();
    }

    // 완전 탐색을 수행하는 메소드
    private static void bruteForce(int idx, int cur){
        if(idx == n) {
            max = Math.max(max, cur);
            min = Math.min(min, cur);
            return;
        }

        // 각각의 연산자를 대입하여 완전 탐색 수행
        for(int i=0; i < 4; i++){
            if(op[i] == 0) continue;
            op[i]--;
            
            // 현재값, 연산자 index, 다음 숫자를 전달하여 연산값 전달받는다.
            int temp = calc(cur, i, num[idx]);
            
            // 전달받은 숫자로 완전 탐색 지속 수행
            bruteForce(idx+1, temp);
            op[i]++;
        }
    }

    // 전달된 연산자 값과 함께 값을 연산하여 반환함
    private static int calc(int y, int i, int x){
        int result = 0;
        if(i == 0){
            result = y + x;
        } else if(i == 1) {
            result = y - x;
        } else if(i == 2) {
            result = y * x;
        } else {
            if(y < 0){
                result = (y*-1) / x * -1;
            } else {
                result = y / x;
            }
        }
        return result;
    }
}

 

읽어주셔서 감사합니다. 오류가 있으면 지적해주시면 반영하겠습니다.

반응형