๊ธฐ๋ก๋ฐฉ

BOJ_14888 : ์—ฐ์‚ฐ์ž ๋ผ์›Œ๋„ฃ๊ธฐ ๋ณธ๋ฌธ

CodingTest/Java

BOJ_14888 : ์—ฐ์‚ฐ์ž ๋ผ์›Œ๋„ฃ๊ธฐ

Soom_1n 2023. 2. 20. 15:01

๐Ÿ‘‰ ๋ฌธ์ œ๋งํฌ

 

14888๋ฒˆ: ์—ฐ์‚ฐ์ž ๋ผ์›Œ๋„ฃ๊ธฐ

์ฒซ์งธ ์ค„์— ์ˆ˜์˜ ๊ฐœ์ˆ˜ N(2 ≤ N ≤ 11)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” A1, A2, ..., AN์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ Ai ≤ 100) ์…‹์งธ ์ค„์—๋Š” ํ•ฉ์ด N-1์ธ 4๊ฐœ์˜ ์ •์ˆ˜๊ฐ€ ์ฃผ์–ด์ง€๋Š”๋ฐ, ์ฐจ๋ก€๋Œ€๋กœ ๋ง์…ˆ(+)์˜ ๊ฐœ์ˆ˜, ๋บ„์…ˆ(-)์˜ ๊ฐœ์ˆ˜, 

www.acmicpc.net



๐Ÿ”ธ ๋ฌธ์ œ ๋ถ„์„ ๐Ÿ”ธ

  • ๊ณ ์ •๋œ ์œ„์น˜์˜ ์ˆซ์ž์™€, ๊ทธ ์‚ฌ์ด์— ํ•˜๋‚˜ ์”ฉ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” 4์ข…๋ฅ˜์˜ ์—ฐ์‚ฐ์ž๋“ค์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
    • ๊ณ„์‚ฐ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฐ’์˜ ์ตœ๋Œ€๊ฐ’๊ณผ ์ตœ์†Œ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.
  • ์—ฐ์‚ฐ์ž ์ž๋ฆฌ๋ฅผ ๋ฐ”๊พธ๋ฉด ๊ฐ’์ด ๋‹ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ˆœ์—ด๋กœ ํ’€์ดํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฐ™์€ ์ข…๋ฅ˜์˜ ์—ฐ์‚ฐ์ž๋Š” ์ž๋ฆฌ๋ฅผ ๋ฐ”๊ฟ”๋„ ์ค‘๋ณต๊ณ„์‚ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— dfs๋‚˜ nextpermutation์œผ๋กœ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ”ธ ์ˆœ์—ด ๐Ÿ”ธ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    private static int n, max, min;
    private static int[] numbers, orders, picks;
    private static boolean[] used;

    private static void perm(int idx) { // ์—ฐ์‚ฐ์ž ์ˆœ์„œ ์ˆœ์—ด, idx : orders์—์„œ ํ˜„์žฌ ๊ณ ๋ฅธ ์—ฐ์‚ฐ์ž ์ˆ˜
        if (idx == n - 1) { // ์—ฐ์‚ฐ์ž ๋ชจ๋‘ ๊ณ ๋ฆ„
//            System.out.println(Arrays.toString(picks));
            cal_all();
        } else {
            for (int i = 0; i < n - 1; i++) {
                if (!used[i]) { // orders์˜ i๋ฒˆ์งธ ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ ์•ˆํ–ˆ์œผ๋ฉด ์‚ฌ์šฉ
                    used[i] = true;
                    picks[idx] = orders[i]; // ์‚ฌ์šฉ ์—ฐ์‚ฐ์ž ๊ธฐ๋ก
                    perm(idx + 1);      // ์ˆœ์—ด ์žฌ๊ท€
                    used[i] = false;
                }
            }
        }
    }

    private static void cal_all() {
//        print();
        int num = numbers[0];
        for (int i = 1; i < n; i++) {
            num = calc(num, numbers[i], picks[i - 1]);
        }
        max = Math.max(max, num);
        min = Math.min(min, num);
    }

    private static int calc(int num1, int num2, int order) {
        switch (order) {
            case 0:
                return num1 + num2;
            case 1:
                return num1 - num2;
            case 2:
                return num1 * num2;
            case 3:
                return num1 / num2;
        }
        return 0;
    }

    private static void print() {
        char[] os = {'+', '-', '*', '/'};
        System.out.print(max + " " + min + " " + numbers[0]);
        for (int i = 1; i < n; i++) {
            System.out.print(" " + os[picks[i - 1]] + " " + numbers[i]);
        }
        System.out.println();
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        max = Integer.MIN_VALUE;
        min = Integer.MAX_VALUE;

        numbers = new int[n];
        orders = new int[n - 1];
        picks = new int[n - 1];
        used = new boolean[n - 1];

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

        int idx = 0;
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < 4; i++) {
            int count = Integer.parseInt(st.nextToken());
            for (int j = 0; j < count; j++) {
                orders[idx++] = i;
            }
        }

        perm(0);

        System.out.println(max + "\n" + min);
    }
}

๐Ÿ”ธ ์ฝ”๋“œ ํ•ด์„ ๐Ÿ”ธ

  • perm() ๋ฉ”์„œ๋“œ์—์„œ n-1๊ฐœ์˜ ์—ฐ์‚ฐ์ž๋ฅผ ์ธ๋ฑ์Šค๋กœ ๊ตฌ๋ถ„ํ•ด์„œ ์ˆœ์—ด๋กœ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•œ๋‹ค.
    • n-1๊ฐœ๋ฅผ ๋‹ค ๊ณจ๋ž์œผ๋ฉด, cal_all() ๋ฉ”์„œ๋“œ์—์„œ ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๊ณ  ์ตœ๋Œ€๊ฐ’, ์ตœ์†Œ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

 

๐Ÿ”ธ DFS ๐Ÿ”ธ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
import java.util.StringTokenizer;

public class Main { // dfs ํ’€์ด
    static int[] numbers, cards;
    static int N, ansMax, ansMin;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        N = Integer.parseInt(br.readLine());
        numbers = new int[N];
        cards = new int[4];      // ์—ฐ์‚ฐ์ž๋Š” ์ˆซ์ž๋ณด๋‹ค ํ•œ ๊ฐœ ์ ์Œ

        ansMax = Integer.MIN_VALUE;
        ansMin = Integer.MAX_VALUE;

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

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

        dfs(0, numbers[0], cards[0], cards[1], cards[2], cards[3]);

        System.out.println(ansMax);
        System.out.println(ansMin);
    }
    
    private static void dfs(int idx, int tmp, int a, int b, int c, int d) {
        if (idx == N - 1) {
            ansMax = Math.max(tmp, ansMax);
            ansMin = Math.min(tmp, ansMin);

            return;
        }

        if (a > 0) {
            dfs(idx + 1, tmp + numbers[idx + 1], a - 1, b, c, d);
        }
        if (b > 0) {
            dfs(idx + 1, tmp - numbers[idx + 1], a, b - 1, c, d);
        }
        if (c > 0) {
            dfs(idx + 1, tmp * numbers[idx + 1], a, b, c - 1, d);
        }
        if (d > 0) {
            dfs(idx + 1, tmp / numbers[idx + 1], a, b, c, d - 1);
        }
    }
}

๐Ÿ”ธ ์ฝ”๋“œ ํ•ด์„ ๐Ÿ”ธ

  • dfs() ๋ฉ”์„œ๋“œ์—์„œ 4๊ฐ€์ง€ ์—ฐ์‚ฐ์ž(+, -, *, /)์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋‚จ์•„์žˆ์œผ๋ฉด ํ•˜๋‚˜์”ฉ ์‚ฌ์šฉํ•˜๋ฉฐ ์žฌ๊ท€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ค‘๋ณต์—†์ด ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๋น„๊ตํ•ด๋ณธ๋‹ค.
  • ๊ณ„์‚ฐ ๊ฐ’์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋“ค๊ณ ๋‹ค๋‹ˆ๋Š” ๊ฒฝ์šฐ๊ฐ€, ๊ฐ’์„ ๋”ฐ๋กœ ์ €์žฅํ›„ ๋”ํ•˜๊ณ  ๋นผ๋Š” ๋ฐฉ์‹๋ณด๋” ์กฐ๊ธˆ ๋” ๋นจ๋ž๋‹ค.

 

๐Ÿ”ธ NP๐Ÿ”ธ

import java.util.Arrays;
import java.util.Scanner;

public class Main { // np ํ’€์ด
    static int[] cards;
    static int ansMax, ansMin, N;
    static int[] numbers;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        N = sc.nextInt();
        numbers = new int[N];
        cards = new int[N - 1];      // ์—ฐ์‚ฐ์ž๋Š” ์ˆซ์ž๋ณด๋‹ค ํ•œ ๊ฐœ ์ ์Œ

        ansMax = Integer.MIN_VALUE;
        ansMin = Integer.MAX_VALUE;

        for (int i = 0; i < N; i++) {
            numbers[i] = sc.nextInt();
        }

        int cardIdx = 0;
        for (int i = 0; i < 4; i++) {
            int count = sc.nextInt();
            for (int j = 0; j < count; j++) {
                cards[cardIdx++] = i;
            }
        }
//        System.out.println(Arrays.toString(cards));

        Arrays.sort(cards);

        do {
            //print();
            cal_all();
        } while (np());

        System.out.println(ansMax);
        System.out.println(ansMin);
    }

    private static boolean np() {
        // step1. ๋’ค์ชฝ๋ถ€ํ„ฐ ๊ผญ๋Œ€๊ธฐ๋ฅผ ์ฐพ๋Š”๋‹ค. (๊ผญ๋Œ€๊ธฐ ๋ฐ”๋กœ ์•ž์ด ๊ตํ™˜ํ•  ์ž๋ฆฌ)
        int n = cards.length;
        int i = n - 1;
        while (i > 0 && cards[i - 1] >= cards[i])
            i--;

        if (i == 0) // ์ด๋ฏธ ๋งˆ์ง€๋ง‰ ์ˆœ์—ด์ž„
            return false;

        // stemp2. ๊ผญ๋Œ€๊ธฐ ๋ฐ”๋กœ ์•ž(i-1) ์ž๋ฆฌ์— ๊ตํ™˜ํ•  ๊ฐ’์„ ๋’ค์ชฝ๋ถ€ํ„ฐ ์ฐพ๋Š”๋‹ค.
        int j = n - 1;
        while (cards[i - 1] >= cards[j]) --j; // ๋ฌด์กฐ๊ฑด ํ•˜๋‚˜๋ฅผ ์ฐพ๋Š”๋‹ค(๊ผญ๋Œ€๊ธฐ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ)

        // step3. ๊ผญ๋Œ€๊ธฐ ๋ฐ”๋กœ ์•ž(i-1)์ž๋ฆฌ์™€ ๊ทธ ์ž๋ฆฌ๊ฐ’๋ณด๋‹ค ํ•œ ๋‹จ๊ณ„ ํฐ ์ž๋ฆฌ(j) ์ˆ˜์™€ ๊ตํ™˜
        swap(cards, i - 1, j);

        // step4. ๊ผญ๋Œ€๊ธฐ๋ถ€ํ„ฐ ๋งจ ๋’ค๊นŒ์ง€ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ
        int k = n - 1;
        while (i < k) {
            swap(cards, i++, k--);
        }
        return true;
    }

    private static void swap(int[] input, int i, int j) {
        int temp = input[i];
        input[i] = input[j];
        input[j] = temp;
    }

    private static void cal_all() {
        int num = numbers[0];
        for (int i = 1; i < N; i++) {
            num = calc(num, numbers[i], cards[i - 1]);
        }
        ansMax = Math.max(ansMax, num);
        ansMin = Math.min(ansMin, num);
    }

    private static int calc(int num1, int num2, int order) {
        switch (order) {
            case 0:
                return num1 + num2;
            case 1:
                return num1 - num2;
            case 2:
                return num1 * num2;
            case 3:
                return num1 / num2;
        }
        return 0;
    }

    private static void print() {
        char[] os = {'+', '-', '*', '/'};
        System.out.print(ansMax + " " + ansMin + " " + numbers[0]);
        for (int i = 1; i < N; i++) {
            System.out.print(" " + os[cards[i - 1]] + " " + numbers[i]);
        }
        System.out.println();
    }
}

๐Ÿ”ธ ์ฝ”๋“œ ํ•ด์„ ๐Ÿ”ธ

  • Next Permutaion ์„ ํ™œ์šฉํ•ด์„œ ์ค‘๋ณต์—†์ด ์—ฐ์‚ฐ์ž๋ฅผ ๊ณ ๋ฅธ ๋ฐฉ๋ฒ•์ด๋‹ค.
    • ์ž…๋ ฅ๋œ ์—ฐ์‚ฐ์ž ๋ฒˆํ˜ธ๋ฅผ 1์ฐจ์› ๋ฐฐ์—ด cards์— ์ €์žฅํ•˜๊ณ  ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•œ๋‹ค.
    • np๋กœ ์—ฐ์‚ฐ์ž ๋ฒˆํ˜ธ๋ฅผ ๋ฐ”๊ฟ”๊ฐ€๋ฉฐ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ์ค‘๋ณต ์ œ๊ฑฐ ๋œ ์ˆœ์—ด๋กœ ๊ณ„์‚ฐํ•˜๊ณ  ์ตœ๋Œ€ ์ตœ์†Œ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
    • ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์ด dfs๋ณด๋‹ค ์ ์œผ๋ฏ€๋กœ ๋” ๋น ๋ฅด๋‹ค.

๐Ÿ”ธ end ๐Ÿ”ธ

  • ๊ฐ„๋‹จํ•œ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, dfs์™€ np๋กœ ํ’€์ด๋ฅผ ํ•ด๋ณผ ์ˆ˜ ์žˆ์–ด์„œ ์ข‹์€ ๊ณต๋ถ€๊ฐ€ ๋˜์—ˆ๋‹ค.
  • ์ˆœ์„œ๋Œ€๋กœ ์ˆœ์—ด, dfs, np ํ’€์ด ๊ฒฐ๊ณผ์ด๋‹ค.

728x90

'CodingTest > Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

BOJ_17281 : โšพ  (0) 2023.02.20
BOJ_12865 : ํ‰๋ฒ”ํ•œ ๋ฐฐ๋‚ญ  (0) 2023.02.20
BOJ_19621 : ํšŒ์˜์‹ค ๋ฐฐ์ • 2  (0) 2023.02.20
BOJ_1697 : ์ˆจ๋ฐ”๊ผญ์งˆ  (0) 2023.02.12
BOJ_1954 : ํ™”ํ•™์‹คํ—˜  (0) 2023.02.10