본문 바로가기
프로그래머스 AND 백준

백준 14888번

by 김선지 2024. 4. 3.

재귀로 풀었다.

어차피 n의 최대 수는  11이고 연산자의 최대는 10, 즉 2 3 2 3 으로 나오고 처음으로 나오는 0이 가장 적을 때니까

 

2323 = 4

2223 = 4

2222 = 4

1222 = 4

1122 = 4

1112 = 4

1111 = 4

0111 = 3

0011 = 2

0001 = 1

0000 = 1

으로

나오는 경우의 수는 98304인 것 같다.

단순하게 4의 11승으로 계산해도 백만 대에서 멈추기 때문에 상관없다.

그냥 재귀 돌려도 된다. 아이디어는 다음과 같다.

 

 

 

1. 재귀를 이용해서 푼다.

(base case는 depth가 nums 배열의 length -1과 같을 때, or 수식 배열의 모든 원소가 0일때), 즉 모든 원소에 대한 식을 끝마쳤을 때

 

2. 수식의 개수를 배열에 넣는다고 가정했을 때, 수식 배열의 length는 무조건 4이고 그 안에는 정수가 들어있다.

 

3. 그렇게 된다면 recursive case를 4개 만들어 주고 base case로 배열에 0보다 작은 수가 들어가게 된다면 바로 리턴을 해준다.

(recursive case에 plus >0 라는 if문을 바로 위에 걸어주면 시간복잡도적 측면에서 더 좋을 것 같은데 어차피 시간도 널널해서 재귀 한번 더돌고 위쪽에서 return하게 걸었다.)

 

(솔직히 배열 만들 필요도 없고 그냥 int로 선언해도 될 것 같은데 그냥 만들어봤다.)

이런 문제만 있으면 좋겠다.

 

package programers;

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

public class BOJ14888 {
    static int[] nums;
    static int[] count = new int[4];
    static int max = Integer.MIN_VALUE;
    static int min = Integer.MAX_VALUE;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        nums = new int[n];
        for (int i = 0; i < n; i++) {
            nums[i] = sc.nextInt();
        }
        for (int i = 0; i < 4; i++) {
            count[i] = sc.nextInt();
        }
        recur(nums[0], 0, count[0], count[1], count[2], count[3]); // sum의 첫 값에는 첫번째 index값
        System.out.println(max);
        System.out.println(min);
    }


    public static void recur(int sum, int depth, int plus, int minus, int mul, int div) {
        if (plus < 0 || minus < 0 || mul < 0 || div < 0) {
            return; // 카운트 없는거 썼으면 바로 return해서 다음 recursive case로 돌아간다.
        }
        if (depth == nums.length - 1) {
            max = Math.max(max, sum); // 상황에 맞게 돌았으면 max, min 업데이트 해준다.
            min = Math.min(min, sum);
            return;
        }

        recur(sum + nums[depth + 1], depth + 1, plus - 1, minus, mul, div);
        recur(sum - nums[depth + 1], depth + 1, plus, minus - 1, mul, div);
        recur(sum * nums[depth + 1], depth + 1, plus, minus, mul - 1, div);
        recur(sum / nums[depth + 1], depth + 1, plus, minus, mul, div - 1);

    }
}

'프로그래머스 AND 백준' 카테고리의 다른 글

백준 16139 인간-컴퓨터 상호작용  (0) 2024.05.11
백준 10971  (0) 2024.04.02