본문 바로가기

Programmers/Level3

N으로 표현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution {
    private static int min = 9;
 
    public static void DFS(int num, int N, int cnt, int res) {
        // 최솟값 갱신
        if (num == res) {
            min = Math.min(cnt, min);
            return;
        }
        int add = N;
        // cnt가 8을 넘지 않을 경우만 수행
        for (int i = 0; i < 8 - cnt; i++) {
            DFS(num, N, cnt + i + 1, res + add);
            DFS(num, N, cnt + i + 1, res * add);
            DFS(num, N, cnt + i + 1, res - add);
            DFS(num, N, cnt + i + 1, res / add);
            // N이 나란히 있을 경우
            add = add * 10 + N;
        }
    }
    public int solution(int N, int number) {
        int answer = 0;
        DFS(number, N, 00);
        answer = min == 9 ? -1 : min;
        return answer;
    }
}
cs

DFS로 사칙연산을 수행하였다.

이 과정에서 N을 이어붙인 값에 대해서도 연산 되도록 하였다.

 

문제 풀이는 성공으로 나왔지만, 26과 같은 특정 값에 대해서는 해결할 수 없다는 문제가 있다.

26을 (5*5*5+5)/5로 밖에 풀지 못한다.

하지만 5*5+5/5로 해결할 수 있기 때문에 틀린 해답이다.

 

다른 사람이 푼 해답을 첨부한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.util.HashSet;
import java.util.Set;
class Solution {
    public int solution(int N, int number) {
       int answer = -1;
        Set<Integer>[] setArr = new Set[9];
        int t = N;
        for(int i = 1; i < 9; i++) {
            setArr[i] = new HashSet<>();
            setArr[i].add(t);
            t = t * 10 + N;
        }
        for(int i = 1; i < 9; i++) {
            for(int j = 1; j < i; j++) {
                for(Integer a : setArr[j]) {
                    for(Integer b : setArr[i - j]) {
                        setArr[i].add(a + b);
                        setArr[i].add(a - b);
                        setArr[i].add(b - a);
                        setArr[i].add(a * b);
                        if(b != 0) {
                            setArr[i].add(a / b);
                        }
                        if(a != 0) {
                            setArr[i].add(b / a);
                        }
                    }
                }
            }
        }
        for(int i = 1; i < 9; i++) {
            if(setArr[i].contains(number)) {
                answer = i;
                break;
            }
        }
        return answer;
    }
}
cs

N을 i개 사용했을 때 나올 수 있는 모든 수를 setArr[i]에 저장한 것이다.

이 방법으로 풀면 오류 없이 해결할 수 있다.

'Programmers > Level3' 카테고리의 다른 글

자물쇠와 열쇠  (0) 2021.08.26
징검다리 건너기  (0) 2021.08.26
단속카메라  (0) 2021.08.24
등굣길  (0) 2021.08.24
하노이의 탑  (0) 2021.08.18