본문 바로가기
정리/알고리즘

DP - N으로 표현

by Hudini30 2022. 3. 4.

프로그래머스 (DP) - N으로 표현

해당 문제는 1번재와 2번째의 표현 가능 한 경우를 구한 후 3번째 부터는 첫번째와 2번째 가능수들의 사칙연산 조합
4번째는 1번째와 3번째, 2번째와 2번째의 가능 수들의 사칙연산 조합을 가지도록 로직을 구현했습니다. 순차적으로 모든 경우의 수를 계산하면서 number를 찾게되면 해당 번째를 return 하고 8번째를 넘게되면 -1을 return하도록 로직을 구현했습니다. 4번째를 구할때 3번째와 1번째의 조합은 1번째와 3번째의 조합과 같으므로 그 부분을 조합하는것은 예외로 처리했습니다.

public int solution(int N, int number) {
        if (N == number) {
            return 1;
        }
        List<Set<Integer>> expressList = new ArrayList<>();
        Set<Integer> firstExpress = new HashSet<>();
        firstExpress.add(N);
        expressList.add(firstExpress);
        String nString = String.valueOf(N);
        StringBuilder repeatString = new StringBuilder(nString);
        Set<Integer> secondExpress = new HashSet<>();
        repeatString.append(nString);
        secondExpress.add(Integer.parseInt(repeatString.toString()));
        secondExpress.add(N * N);
        secondExpress.add(N / N);
        secondExpress.add(N - N);
        secondExpress.add(N + N);
        expressList.add(secondExpress);


        for (int i = 2; i <= 8; i++) {
            Set<Integer> expressNumber = new HashSet<>();

            Set<Integer> preExpressNumber = expressList.get(i - 1);
            Optional<Integer> findNumber = preExpressNumber.stream().filter(integer -> integer == number).findFirst();
            if (findNumber.isPresent()) {
                return i;
            }
            if (i < 8) {
                repeatString.append(nString);
                expressNumber.add(Integer.parseInt(repeatString.toString()));
                for (int j = 0; j < i/2; j++) {
                    Set<Integer> firstExpressNumber = expressList.get(j);
                    Set<Integer> secondExpressNumber =expressList.get(i - j - 1);
                    for(Integer firstNumber : firstExpressNumber) {
                        for(Integer secondNumber : secondExpressNumber) {
                            expressNumber.add(firstNumber + secondNumber);
                            expressNumber.add(firstNumber - secondNumber);
                            expressNumber.add(firstNumber * secondNumber);
                            if (secondNumber > 0) {
                                expressNumber.add(firstNumber / secondNumber);
                            }

                            expressNumber.add(secondNumber - firstNumber );
                            if (firstNumber > 0) {
                                expressNumber.add(secondNumber / firstNumber);
                            }
                        }
                    }
                }

                expressList.add(expressNumber);
            }
        }

        return -1;
    }

'정리 > 알고리즘' 카테고리의 다른 글

DP - 등굣길  (0) 2022.03.08
DP - 정수 삼각형  (0) 2022.03.07
탐욕법 - 단속카메라  (0) 2022.03.03
탐욕법 - 섬 연결하기  (0) 2022.03.02
탐욕법 - 구명보트  (0) 2022.03.01

댓글