[이코테][Java] 연산자 끼워넣기

2025. 5. 12. 17:40·PS/이코테

[문제링크]

https://www.acmicpc.net/problem/14888


문제 설명

N개의 수로 이루어진 수열과 수와 수 사이에 끼워넣을 수 있는 N-1개의 연산자가 주어진다.

연산자는 덧셈, 뺄셈, 곱셈, 나눗셈 순서 

수와 수 사이에 연산자를 하나씩 넣어서 수식을 만들 때, 식의 결과가 최대인 것과 최소인 것을 구하는 프로그램을 작성하시오.

이 때, 식의 계산은 연산자 우선 순위를 무시하고 앞에서부터 진행하고 나눗셈은 정수 나눗셈으로 몫만 취한다.

음수를 양수로 나눌 때에는 음수를 양수로 바뀐 뒤 몫을 취하고, 그 몫을 음수로 바꾼다.

 

입력조건

  • 첫째 줄에 수의 개수 N
  • 둘째 줄에 수열
  • 셋째 줄에 각 연산자의 개수

출력조건

  • 식 결과의 최대값과 최솟값

입출력 예시

입력예시 출력예시
2
5 6
0 0 1 0
30
30
3
3 4 5
1 0 1 0
35
17
6
1 2 3 4 5 6
2 1 1 1
54
-24

 

 

 

 

문제 풀이

  • DFS 알고리즘을 이용한 풀이
  • 재귀함수를 활용해서 가능한 모든 경우의 수를 찾아서 연산의 결과값을 구한다.
  • index = 수의 인덱스이자 깊이, result = 현재 식의 연산 결과값
  • 반복문으로 연산자 배열을 순회하면서 연산자가 1개 이상 남아있을 경우, 해당 연산자를 사용해서 계산한 후 재귀 호출해서 다음 연산을 수행한다.
  • 재귀호출이 종료되면 해당 연산자 개수를 다시 복구해야 한다.
    • 재귀호출 종료 후 다시 돌아와서 다음 연산자로 수행하기 위함
    • ex) 입출력예시3 일부를 그려보면 아래와 같다.
            index=3일 때(숫자 4), 연산자를 담은 배열은 0 0 1 1(연산자 * 1개, 연산자 / 1개가 남아있다는 의미)
            이 상태에서 노란부분은 0 0 0 1(* 사용) → 0 0 0 0(/ 사용) 하고 재귀호출이 종료된다.
            종료 후에 다시 돌아와서 연두색 부분을 수행하기 위해서는 0 0 0 0 인 연산자 배열이 0 0 1 1 상태가 되어야 한다.
           그래서 재귀호출이 종료되면 해당 연산자 개수를 복구해야 한다.

  • index이 n과 같으면 모든 연산자를 다 사용했다는 것이므로, 해당 값이 최대값인지 최소값인지 비교해서 교체한다.
import java.io.*;
import java.util.StringTokenizer;

public class Main {

    public static int n;
    public static int[] array = new int[12];
    public static int[] operator = new int[4];
    public static int max = Integer.MIN_VALUE;
    public static int min = Integer.MAX_VALUE;

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

        n = Integer.parseInt(br.readLine());    //수의 개수

        //n개의 수 입력
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < n; i++) {
            array[i] = Integer.parseInt((st.nextToken()));
        }

        //연산자 종류별 개수 입력
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < 4; i++) {
            operator[i] = Integer.parseInt(st.nextToken());
        }

        dfs(1, array[0]);
        System.out.println(max + "\n" + min);

    }

    public static void dfs(int index, int result) {
        //종료조건
        if (index == n) {
            max = Math.max(max, result);
            min = Math.min(min, result);
            return;
        }

        for (int i = 0; i < 4; i++) {
            if (operator[i] != 0) {	//연산자 개수가 1개 이상인 경우, 해당 연산자 사용
                operator[i]--;	//해당 연산자 1 감소
                switch (i) {
                    case 0 :
                        dfs(index + 1, result + array[index]);
                        break;
                    case 1 :
                        dfs(index + 1, result - array[index]);
                        break;
                    case 2 :
                        dfs(index + 1, result * array[index]);
                        break;
                    case 3:
                        dfs(index + 1, result / array[index]);
                        break;
                }
                // 해당 연산자의 개수를 원래대로 복구
                operator[i]++;	
            }
        }
    }
}

 


[참고서적]

이것이 취업을 위한 코딩 테스트다 with 파이썬 by 나동빈

저작자표시 비영리 변경금지 (새창열림)

'PS > 이코테' 카테고리의 다른 글

[이코테][Java] 퇴사  (0) 2025.05.12
[이코테][Java] 병사 배치하기  (0) 2025.04.29
[이코테][Java] 편집거리  (0) 2025.04.27
[이코테][Java] 못생긴 수  (0) 2025.04.13
[이코테] 다이나믹 프로그래밍(Dynamic Programming)  (0) 2025.04.12
'PS/이코테' 카테고리의 다른 글
  • [이코테][Java] 퇴사
  • [이코테][Java] 병사 배치하기
  • [이코테][Java] 편집거리
  • [이코테][Java] 못생긴 수
nyrimmm
nyrimmm
  • nyrimmm
    개발기록
    nyrimmm
  • 전체
    오늘
    어제
  • 글쓰기 관리
    • 분류 전체보기 (69)
      • Java (6)
      • Spring & SpringBoot (3)
      • Network (1)
      • DataBase (0)
      • SQL (1)
      • IntelliJ (3)
      • Git (0)
      • 자료구조 & 알고리즘 (2)
      • 트러블 슈팅 (1)
        • Spring (1)
      • PS (51)
        • 백준 (11)
        • 프로그래머스 (0)
        • SQL (9)
        • 이코테 (31)
      • 후기 & 회고 (1)
  • 태그

  • 인기 글

  • 최근 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
nyrimmm
[이코테][Java] 연산자 끼워넣기
상단으로

티스토리툴바