[2024 동계 모각코]

[2024 동계 모각코] 5회차 개인 목표 및 결과

multipotentialite1 2025. 2. 4. 16:53

일시 : 2025.02.02. 18:00 ~ 22:00

 

[5회차 목표]

- 스택, 큐, 완전탐색, DFS, BFS 개념 학습

 

[5회차 결과]

- 완전탐색, DFS, BFS의 작동 원리와 개념에 대해 학습하였습니다.

 

1. 완전탐색(Brute Force)
- 가능한 모든 경우의 수를 전부 탐색함
- 경우의 수가 많을 경우 비효율적
- 순열, 조합, 백트래킹

package 완전탐색_BFS_DFS_250130;

import java.io.*;
import java.util.*;

public class P2798_블랙잭 {
    public static void main(String[] args)throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        // N, M을 입력받아 저장
        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());

        // N개의 배열 생성에 카드 수 저장
        int[] card = new int[N];
        // StringTokenizer을 이미 생성했으므로, 다시 생성하지 않는다.
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < N; i++) {
            card[i] = Integer.parseInt(st.nextToken());
        }
        int max = 0; // max값을 저장할 변수

        for (int i = 0; i < N-2; i++) { // 첫 번째 고정 값
            for (int j = i+1; j < N-1; j++) { // 두 번째 고정 값
                for (int k = j+1; k < N; k++) { // 세 번째 고정 값
                    int cardvalue = card[i] + card[j] + card[k];
                    if (cardvalue <= M) {
                        if (max < cardvalue) {
                            max = cardvalue;
                        }
                    }
                        // 동일한 내용 | max = Math.max(max, cardvalue);

                    }
                }
        }
        bw.write(Integer.toString(max));
        bw.flush();
    }
}

 

2. DFS(Depth First Search, 깊이 우선 탐색)
- 가능한 멀리까지 탐색한 후, 다시 되돌아오는 방식

- 재귀 또는 스택을 활용하여 구현

 

3. BFS(Breadth First Search, 너비 우선 탐색)

- 갈 수 있는 모든 노드를 우선 탐색한 후, 다음 깊이의 노드들을 탐색하는 방식

- 큐(Queue)를 활용하여 구현

package 그래프이론_250130;

import java.io.*;
import java.util.*;

public class P1260_DFSBFS {
    static boolean[] visit;
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    static int N;
    static int[][] graph;

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

        StringTokenizer st = new StringTokenizer(br.readLine());

        N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        int V = Integer.parseInt(st.nextToken());

        graph = new int[N+1][N+1];
        for (int i = 0; i < M; i++) {
            st = new StringTokenizer(br.readLine());
            int A = Integer.parseInt(st.nextToken());
            int B = Integer.parseInt(st.nextToken());

            graph[A][B] = 1;
            graph[B][A] = 1;
        }

        visit = new boolean[N+1]; // 방문처리 초기화
        visit[V] = true; // V를 방문처리
        dfs(V);
        bw.newLine();
        bw.flush();

        visit = new boolean[N+1];
        bfs(V);
        bw.flush();
    }

    static void dfs(int V)throws IOException {
        bw.write(V + " ");
        for (int i = 1;i <= N; i++) {
            if (graph[V][i] == 1 && !visit[i]) {
                visit[i] = true;
                dfs(i);
            }
        }
    }
    static void bfs(int V)throws IOException {
        Queue<Integer> Q = new LinkedList<Integer>();
        Q.offer(V);
        visit[V] = true;

        while (!Q.isEmpty()) {
            int now = Q.poll();
            bw.write(now + " ");
            for (int i = 1; i <= N; i++) {
                if (!visit[i] && graph[now][i] == 1) {
                    Q.offer(i);
                    visit[i] = true;
                }

            }
        }
    }
}

 

[인접리스트]

package 그래프이론_250130;

import java.io.*;
import java.util.*;

public class 인접리스트 {
    static boolean[] visit;
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    static int N;
    static ArrayList<ArrayList<Integer>> graph = new ArrayList<>();

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

        StringTokenizer st = new StringTokenizer(br.readLine());

        N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        int V = Integer.parseInt(st.nextToken());
        for (int i = 0; i <= N; i++) {
            graph.add(new ArrayList<>());
        }

        for (int i = 0; i < M; i++) {
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());

            graph.get(a).add(b);
            graph.get(b).add(a);

        }

        for (int i = 1; i <= N; i++) {
            Collections.sort(graph.get(i)); // 정령하거라
        }

        visit = new boolean[N+1]; // 방문처리 초기화
        visit[V] = true; // V를 방문처리
        dfs(V);
        bw.newLine();
        bw.flush();

        visit = new boolean[N+1];
        bfs(V);
        bw.flush();
    }

    static void dfs(int V)throws IOException {
        bw.write(V + " ");
            for (int i = 0; i < graph.get(V).size(); i++) {
                int next = graph.get(V).get(i);
                if (!visit[next]) {
                    visit[next] = true;
                    dfs(next);
            }
        }
    }
    static void bfs(int V)throws IOException {
        Queue<Integer> Q = new LinkedList<Integer>();
        Q.offer(V);
        visit[V] = true;

        while (!Q.isEmpty()) {
            int now = Q.poll();
            bw.write(now + " ");
            for (int i = 0; i < graph.get(now).size(); i++) {
                int next = graph.get(now).get(i);
                if (!visit[next]) {
                    visit[next] = true;
                    Q.offer(next);
                }
            }

        }
    }
}