코딩테스트

[DFS] 2. 바둑이 승차

개발하는지호 2024. 2. 16. 09:46

<<풀이>>

 

 

-나의 풀이- 

 

아직 익숙하지 않은 탓인가 ?? 문제는 쉬워 보였고 실제로도 그렇게 어렵지 않게 풀이를 만들었는데, 논리적으로 맞는거 같지만 그러하지 못하고 틀렸다 ㅠㅠ

 

일단 나는 각 자리 수를 더한다 아니면 더 하지 않는다 이렇게 경우의 수를 두고 진행했다.

import java.util.ArrayList;
import java.util.Scanner;

class Main {
    static int answer;
    static ArrayList<Integer> list = new ArrayList<>();;


    private void DFS(int L, int maxNum, int[] arr) {


        if (answer > maxNum) {
            answer -= arr[L - 1];
            list.add(answer);
            return;
        } else {
            if(L > arr.length - 1) return;
            answer += arr[L];
            DFS(L + 1, maxNum, arr);
            answer -= arr[L];
            DFS(L + 1, maxNum, arr);
        }
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner in = new Scanner(System.in);
        int maxNum = in.nextInt();
        int total = in.nextInt();
        int[] arr = new int[total];

        for (int i = 0; i < total; i++) {
            arr[i] = in.nextInt();
        }

        T.DFS(0, maxNum, arr);
        int max = 0;
        for (int x : list) {
            if (max <= x) max = x;
        }

        System.out.println(max);

    }
}

 

 

-강사님 풀이-

 

아 맞다 이렇게 하면 되는구나 ~~ 하고 있다 ㅋㅋ

 

<<풀이 접근 방식>>

이 문제의 핵심 풀이법은 2^n 이다. 합할까 합하지 않을까 이렇게 2가지로 계속 내려온다. 그래서 결과값의 갯수는 원래 총 2^n 이다.

근데, 범위 내의 값을 가져오는 조건이 있기 때문에 그 조건에 해당하지 않으면 빼는 것 뿐이다. 이러한 논리구조로 푼다면 쉽게 접근이 가능하다.

 

<<구조적 접근 방식>>

DFS의 매개변수에 sum을 넣는 방식을 사용하고 있다.

전체적인 구조는 재귀함수로서 돌기 때문에 그 다음 재귀함수가 진행이 될때, 조건으로 성립하는지 먼저 판 별한 후에 그 다음 식을 진행한다.

여기서 나는 sum + arr[L] 하고 return해서 돌아오면, 뭔가가 sum에 대한 내용이 바뀔거 같지만, 

조건을 충족하고  Math.max 안 에 넣고 거기에 대한 반환값이 answer 에 다시 넣어줄 때 비로소 반영이 된다. 

 

*주로 DFS문제는 if가 있고 그 다음 DFS가 있다.


import java.util.Scanner;

class Main {
    static int answer, c, n;

    private void DFS(int L, int sum, int[] arr) {
        if (sum > c) return; // 필터 역할을 하고 있네
        if (L == n)  {
            answer = Math.max(sum, answer);
        } else {
            DFS(L+1, sum + arr[L], arr);
            DFS(L+1, sum , arr);
        }
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner in = new Scanner(System.in);
        c = in.nextInt();
        n = in.nextInt();
        int[] arr = new int[n];

        for (int i = 0; i < n; i++) {
            arr[i] = in.nextInt();
        }

        T.DFS(0, 0, arr);
        System.out.println(answer);
    }
}

 

이번 문제를 풀면서 머릿속으로 하니깐 이해도 면에서 긴가민가한 거 같다 ㅋㅋ

 

이 문제를 직접 그려보면서 다시 봐야겠다 !!

 

 

추가 공부로 직접 그려보았다. 역시 그려보니까 훨씬 이해가 잘 된다. DFS 와 BFS는 머리로만 파악하기에 한계가 있다.

 

따라서, 이를 직접 그려보고 판단하자!!