πŸ₯ˆ [Baekjoon / Java] 14888. μ—°μ‚°μž λΌμ›Œλ„£κΈ°

μ΄ν•˜μ–€Β·2024λ…„ 5μ›” 16일
0

🐣 λ°±μ€€

λͺ©λ‘ 보기
13/33

문제 μ„€λͺ…


πŸ’‘ Info


λ‚΄μš©

N개의 수둜 이루어진 μˆ˜μ—΄ A1, A2, ..., AN이 주어진닀. 또, μˆ˜μ™€ 수 사이에 λΌμ›Œλ„£μ„ 수 μžˆλŠ” N-1개의 μ—°μ‚°μžκ°€ 주어진닀. μ—°μ‚°μžλŠ” λ§μ…ˆ(+), λΊ„μ…ˆ(-), κ³±μ…ˆ(Γ—), λ‚˜λˆ—μ…ˆ(Γ·)으둜만 이루어져 μžˆλ‹€.

μš°λ¦¬λŠ” μˆ˜μ™€ 수 사이에 μ—°μ‚°μžλ₯Ό ν•˜λ‚˜μ”© λ„£μ–΄μ„œ, μˆ˜μ‹μ„ ν•˜λ‚˜ λ§Œλ“€ 수 μžˆλ‹€. μ΄λ•Œ, 주어진 수의 μˆœμ„œλ₯Ό λ°”κΎΈλ©΄ μ•ˆ λœλ‹€.

예λ₯Ό λ“€μ–΄, 6개의 수둜 이루어진 μˆ˜μ—΄μ΄ 1, 2, 3, 4, 5, 6이고, 주어진 μ—°μ‚°μžκ°€ λ§μ…ˆ(+) 2개, λΊ„μ…ˆ(-) 1개, κ³±μ…ˆ(Γ—) 1개, λ‚˜λˆ—μ…ˆ(Γ·) 1개인 κ²½μš°μ—λŠ” 총 60κ°€μ§€μ˜ 식을 λ§Œλ“€ 수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄, μ•„λž˜μ™€ 같은 식을 λ§Œλ“€ 수 μžˆλ‹€.

  • 1+2+3-4Γ—5Γ·6
  • 1Γ·2+3+4-5Γ—6
  • 1+2Γ·3Γ—4-5+6
  • 1Γ·2Γ—3-4+5+6

μ‹μ˜ 계산은 μ—°μ‚°μž μš°μ„  μˆœμœ„λ₯Ό λ¬΄μ‹œν•˜κ³  μ•žμ—μ„œλΆ€ν„° 진행해야 ν•œλ‹€. 또, λ‚˜λˆ—μ…ˆμ€ μ •μˆ˜ λ‚˜λˆ—μ…ˆμœΌλ‘œ λͺ«λ§Œ μ·¨ν•œλ‹€. 음수λ₯Ό μ–‘μˆ˜λ‘œ λ‚˜λˆŒ λ•ŒλŠ” C++14의 기쀀을 λ”°λ₯Έλ‹€. 즉, μ–‘μˆ˜λ‘œ λ°”κΎΌ λ’€ λͺ«μ„ μ·¨ν•˜κ³ , κ·Έ λͺ«μ„ 음수둜 λ°”κΎΌ 것과 κ°™λ‹€. 이에 λ”°λΌμ„œ, μœ„μ˜ 식 4개의 κ²°κ³Όλ₯Ό 계산해보면 μ•„λž˜μ™€ κ°™λ‹€.

  • 1+2+3-4Γ—5Γ·6 = 1
  • 1Γ·2+3+4-5Γ—6 = 12
  • 1+2Γ·3Γ—4-5+6 = 5
  • 1Γ·2Γ—3-4+5+6 = 7

N개의 μˆ˜μ™€ N-1개의 μ—°μ‚°μžκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, λ§Œλ“€ 수 μžˆλŠ” μ‹μ˜ κ²°κ³Όκ°€ μ΅œλŒ€μΈ 것과 μ΅œμ†ŒμΈ 것을 κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

πŸ“₯μž…λ ₯ 쑰건

  • 첫째 쀄에 수의 개수 N(2 ≀ N ≀ 11)κ°€ 주어진닀. λ‘˜μ§Έ μ€„μ—λŠ” A1, A2, ..., AN이 주어진닀. (1 ≀ Ai ≀ 100) μ…‹μ§Έ μ€„μ—λŠ” 합이 N-1인 4개의 μ •μˆ˜κ°€ μ£Όμ–΄μ§€λŠ”λ°, μ°¨λ‘€λŒ€λ‘œ λ§μ…ˆ(+)의 개수, λΊ„μ…ˆ(-)의 개수, κ³±μ…ˆ(Γ—)의 개수, λ‚˜λˆ—μ…ˆ(Γ·)의 κ°œμˆ˜μ΄λ‹€.

πŸ“€μΆœλ ₯ 쑰건

  • 첫째 쀄에 λ§Œλ“€ 수 μžˆλŠ” μ‹μ˜ 결과의 μ΅œλŒ“κ°’μ„, λ‘˜μ§Έ μ€„μ—λŠ” μ΅œμ†Ÿκ°’μ„ 좜λ ₯ν•œλ‹€. μ—°μ‚°μžλ₯Ό μ–΄λ–»κ²Œ λΌμ›Œλ„£μ–΄λ„ 항상 -10얡보닀 ν¬κ±°λ‚˜ κ°™κ³ , 10얡보닀 μž‘κ±°λ‚˜ 같은 κ²°κ³Όκ°€ λ‚˜μ˜€λŠ” μž…λ ₯만 주어진닀. λ˜ν•œ, μ•žμ—μ„œλΆ€ν„° κ³„μ‚°ν–ˆμ„ λ•Œ, 쀑간에 κ³„μ‚°λ˜λŠ” μ‹μ˜ 결과도 항상 -10얡보닀 ν¬κ±°λ‚˜ κ°™κ³ , 10얡보닀 μž‘κ±°λ‚˜ κ°™λ‹€.

μž…μΆœλ ₯ μ˜ˆμ‹œ

  • μž…λ ₯ 1
    2
    5 6
    0 0 1 0
  • 좜λ ₯ 1
    30
    30

  • μž…λ ₯ 2
    3
    3 4 5
    1 0 1 0
  • 좜λ ₯ 2
    35
    17

  • μž…λ ₯ 3
    6
    1 2 3 4 5 6
    2 1 1 1
  • 좜λ ₯ 3
    54
    -24


유의 사항 및 μ œμ•½ 쑰건


  • Hint
    • μ„Έ 번째 예제의 κ²½μš°μ— λ‹€μŒκ³Ό 같은 식이 μ΅œλŒ“κ°’/μ΅œμ†Ÿκ°’μ΄ λ‚˜μ˜¨λ‹€.
      • μ΅œλŒ“κ°’: 1-2Γ·3+4+5Γ—6
      • μ΅œμ†Ÿκ°’: 1+2+3Γ·4-5Γ—6


문제 이해


  • N개의 μˆ˜μ™€ N-1개의 μ—°μ‚°μžκ°€ 주어지면, λ§Œλ“€ 수 μžˆλŠ” μ‹μ˜ κ²°κ³Ό 쀑 μ΅œλŒ€μ™€ μ΅œμ†Œλ₯Ό 좜λ ₯ν•˜κΈ°
    • 단, μ—°μ‚°μž μš°μ„  μˆœμœ„ λ¬΄μ‹œν•˜κ³  μ•žμ—μ„œλΆ€ν„° 진행!
    • λ‚˜λˆ—μ…ˆμ€ μ •μˆ˜ λ‚˜λˆ—μ…ˆμœΌλ‘œ λͺ«λ§Œ 취함!


μ•Œκ³ λ¦¬μ¦˜


μ‹€μ œ 풀이 μ‹œκ°„ : 30λΆ„

  • μž…λ ₯
    • 수의 개수 N μž…λ ₯λ°›κΈ°
    • μˆ˜μ—΄ μž…λ ₯λ°›κΈ°(λ°°μ—΄)
    • λ§μ…ˆ(+)의 개수, λΊ„μ…ˆ(-)의 개수, κ³±μ…ˆ(Γ—)의 개수, λ‚˜λˆ—μ…ˆ(Γ·)의 개수 μž…λ ₯λ°›κΈ°
  • 계산
    • μ΅œλŒ€ : λ‚˜λˆ—μ…ˆ, λ§μ…ˆ, λΊ„μ…ˆ, κ³±μ…ˆ 순으둜 λΌμ›Œλ„£κΈ°
      • 단, 개수λ₯Ό λͺ¨λ‘ μ†ŒλΉ„ν•  λ•ŒκΉŒμ§€ 같은 μ—°μ‚°μžκ°€ μ—°μ†μœΌλ‘œ 듀어가도둝 μž‘μ„±
    • μ΅œμ†Œ : λ§μ…ˆ, λΊ„μ…ˆ, κ³±μ…ˆ, λ‚˜λˆ—μ…ˆ 순으둜 λΌμ›Œλ„£κΈ°
      • 단, 개수λ₯Ό λͺ¨λ‘ μ†ŒλΉ„ν•  λ•ŒκΉŒμ§€ 같은 μ—°μ‚°μžκ°€ μ—°μ†μœΌλ‘œ 듀어가도둝 μž‘μ„±
import java.util.*;
public class BJ14888 {

    static int N;
    static int[] num;
    static int[] oper;
    static int maxResult = Integer.MAX_VALUE;
    static int minResult = Integer.MIN_VALUE;
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);

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

        oper = new int[4];
        for(int i=0; i<4; i++){
            oper[i] = sc.nextInt();
        }

        int result = 0;

        for(int i=0; i<4; i++){
            int index = 0;
            if(oper[i] > 0) {
                switch (i) {
                    case 0:
                        Math.max(num[index] / num[index], index / 1);
                        break;
                    case 1:
                        Math.max(num[index] + num[index], index - 1);
                        break;
                    case 2:
                        Math.max(num[index] - num[index], index - 1);
                        break;
                    case 3:
                        Math.max(num[index] * num[index], index * 1);
                        break;
                }
                maxResult = Math.max(maxResult, result);
                minResult = Math.min(minResult, result);
            }
        }
        System.out.println(maxResult);
        System.out.println(minResult);
    }
}


μ˜€λ‹΅ 체크


  • DFSλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³ , λ°”λ‘œ 계산해 intν˜•μ˜ μ΅œλŒ“κ°’κ³Ό μ΅œμ†Ÿκ°’μ΄ μž…λ ₯κ³Ό 관계없이 λ‚˜μ˜€λŠ” 문제 λ°œμƒ
    • DFS μ„ μ–Έν•˜κ³  쑰건을 μΆ”κ°€ν•΄ ν•΄κ²°

      //before
      int result = 0;
      
              for(int i=0; i<4; i++){
                  int index = 0;
                  if(oper[i] > 0) {
                      switch (i) {
                          case 0:
                              Math.max(num[index] / num[index], index / 1);
                              break;
                          case 1:
                              Math.max(num[index] + num[index], index - 1);
                              break;
                          case 2:
                              Math.max(num[index] - num[index], index - 1);
                              break;
                          case 3:
                              Math.max(num[index] * num[index], index * 1);
                              break;
                      }
                      maxResult = Math.max(maxResult, result);
                      minResult = Math.min(minResult, result);
                  }
              }
              System.out.println(maxResult);
              System.out.println(minResult);
  • 값이 좜λ ₯이 λ˜κΈ°λŠ” ν•˜μ§€λ§Œ, μ—¬μ „νžˆ 잘λͺ»λœ 값이 좜λ ₯λ˜λŠ” 문제 λ°œμƒ
    • Switch-case문의 μ—°μ‚°μž 계산 μΌ€μ΄μŠ€λ₯Ό μˆœμ„œλ₯Ό 일반적인 +, -, /, * 순으둜 λ‹€μ‹œ μž¬κ΅¬μ„±

    • μ—°μ‚° λ‹€μŒμ—λŠ” λ‹€μŒ 숫자둜 λ„˜μ–΄κ°€λ„λ‘ κ΅¬μ„±ν•΄μ„œ ν•΄κ²°

      //ing
      ...
          static int maxResult = Integer.MIN_VALUE; // 초기 μ΅œλŒ€κ°’μ„ κ°€μž₯ μž‘μ€ κ°’μœΌλ‘œ μ„€μ •
          static int minResult = Integer.MAX_VALUE; // 초기 μ΅œμ†Œκ°’μ„ κ°€μž₯ 큰 κ°’μœΌλ‘œ μ„€μ •
          
          public static void main(String[] args){
              Scanner sc = new Scanner(System.in);
      
              ...
      
              dfs(num[0], 1); // 초기 값은 μˆ˜μ—΄μ˜ 첫 번째 μˆ«μžλΆ€ν„° μ‹œμž‘
      
              System.out.println(maxResult);
              System.out.println(minResult);
          }
      		...
      
                      switch (i) {
                          case 0:
                              //dfs λ’·λΆ€λΆ„ λ³€μˆ˜λ₯Ό λͺ¨λ‘ λ‹€μŒ 수λ₯Ό μ˜λ―Έν•˜λŠ” index+1둜 λ³€κ²½ν•˜κΈ°!
                              dfs(num[index] / num[index], index + 1);
                              break;
                          case 1:
                              dfs(num[index] + num[index], index + 1);
                              break;
                          case 2:
                              dfs(num[index] - num[index], index + 1);
                              break;
                          case 3:
                              dfs(num[index] * num[index], index + 1);
                              break;
                      }
                      //μž¬κ·€ν˜ΈμΆœ μ’…λ£Œ ν›„ μ—°μ‚°μž 개수 λ³΅κ΅¬ν•˜κΈ°
                      oper[i]++;
                  }
              }
          }
      }
      
      //after
      for (int i = 0; i < 4; i++) {
        if (oper[i] > 0) {
            oper[i]--;
      
            int nextNum = 0;
            switch (i) {
                case 0:
                    nextNum = oneNum + num[index];
                    break;
                case 1:
                    nextNum = oneNum - num[index];
                    break;
                case 2:
                    nextNum = oneNum * num[index];
                    break;
                case 3:
                    nextNum = oneNum / num[index];
                    break;
            }
      
            dfs(nextNum, index + 1);
            oper[i]++; // μž¬κ·€ 호좜이 λλ‚œ ν›„ μ—°μ‚°μž 개수 볡ꡬ
        }
      }
      }


μ΅œμ’… 풀이


μ‹€μ œ 풀이 μ‹œκ°„ : 51λΆ„(첫 풀이 포함)

  • μž…λ ₯
    • 수의 개수 N μž…λ ₯λ°›κΈ°
    • μˆ˜μ—΄ μž…λ ₯λ°›κΈ°(λ°°μ—΄)
    • λ§μ…ˆ(+)의 개수, λΊ„μ…ˆ(-)의 개수, κ³±μ…ˆ(Γ—)의 개수, λ‚˜λˆ—μ…ˆ(Γ·)의 개수 μž…λ ₯λ°›κΈ°
  • 계산
    • μ΅œλŒ€μ™€ μ΅œμ†Œ λ³€μˆ˜ μ„ μ–Έ ν›„ DFS둜 μž¬κ·€ ν˜ΈμΆœν•˜κΈ°
    • index == N 즉, λͺ¨λ“  숫자λ₯Ό λ‹€ μ‚¬μš©ν•œ 경우 Math.max와 Math.min이 λ‚˜μ˜€λŠ” 쑰건 ꡬ성
    • κ·Έ λ‹€μŒ, λ“€μ–΄μ˜¨ 숫자λ₯Ό switch-case문으둜 +,-,/,* μ—°μ‚° 진행
import java.util.*;
public class Main {

    static int N;
    static int[] num;
    static int[] oper;
    static int maxResult = Integer.MIN_VALUE; // 초기 μ΅œλŒ€κ°’μ„ κ°€μž₯ μž‘μ€ κ°’μœΌλ‘œ μ„€μ •
    static int minResult = Integer.MAX_VALUE; // 초기 μ΅œμ†Œκ°’μ„ κ°€μž₯ 큰 κ°’μœΌλ‘œ μ„€μ •
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);

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

        oper = new int[4];
        for(int i=0; i<4; i++){
            oper[i] = sc.nextInt();
        }

        dfs(num[0], 1); // 초기 값은 μˆ˜μ—΄μ˜ 첫 번째 μˆ«μžλΆ€ν„° μ‹œμž‘

        System.out.println(maxResult);
        System.out.println(minResult);
    }

    public static void dfs(int oneNum, int index){
        if(index == N) { // λͺ¨λ“  숫자λ₯Ό λ‹€ μ‚¬μš©ν•œ 경우
            maxResult = Math.max(maxResult, oneNum);
            minResult = Math.min(minResult, oneNum);
            return;
        }

        for (int i = 0; i < 4; i++) {
            if (oper[i] > 0) {
                oper[i]--;

                int nextNum = 0;
                switch (i) {
                    case 0:
                        nextNum = oneNum + num[index];
                        break;
                    case 1:
                        nextNum = oneNum - num[index];
                        break;
                    case 2:
                        nextNum = oneNum * num[index];
                        break;
                    case 3:
                        nextNum = oneNum / num[index];
                        break;
                }

                dfs(nextNum, index + 1);
                oper[i]++; // μž¬κ·€ 호좜이 λλ‚œ ν›„ μ—°μ‚°μž 개수 볡ꡬ
            }
        }
    }
}

profile
μ–Έμ  κ°€ λ‚΄ μ½”λ“œλ‘œ 세상에 κΈ°μ—¬ν•  수 μžˆλ„λ‘, BE 개발 기둝 λ…ΈνŠΈβ˜˜οΈ

0개의 λŒ“κΈ€