2023.05.16.TUE

ronglong·2023년 5월 16일
0

[ 백준 ]

  • 13023번 ABCDE
    : 문제 이해를 잘못했음. 답지 풀이 보고서 이해했다. 5명이 연결되어 있는지 보는 문제. 마지막에 false로 방문 다시 초기화하는 게 중요한 것 같다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class Main {
    //친구 관계를 인접리스트로 표현
    static List<Integer>[] friends;
    static boolean[] visited;
    static boolean arrive;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //선언
        StringTokenizer stringTokenizer = new StringTokenizer(br.readLine());

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

        //초기화
        friends = new ArrayList[N];
        visited = new boolean[N];
        arrive = false;

        for (int i = 0; i < N; i++) {
            friends[i] = new ArrayList<>();
        }

        //엣지 연결
        for (int i = 0; i < M; i++) {
            stringTokenizer = new StringTokenizer(br.readLine());
            int s = Integer.parseInt(stringTokenizer.nextToken());
            int e = Integer.parseInt(stringTokenizer.nextToken());
            friends[s].add(e);
            friends[e].add(s);
        }

        //5명이 이어져 있으면 1 반환
        for (int i = 0; i < N; i++) {
            if (!visited[i]) {
                DFS(i, 1);
                if (arrive) break;
            }
        }
        if (arrive) System.out.println("1");
        else System.out.println("0");
    }

    public static void DFS(int i, int depth) {
        if (depth == 5 || arrive) {
            arrive = true;
            return;
        }
        visited[i] = true;
        for (int num : friends[i]) {
            if (!visited[num]) {
                DFS(num, depth + 1);
            }
        }
        visited[i] = false;
    }
}
  • 1260번 DFS와 BFS
    : 처음으로 답지 없이 혼자서 푼 DFS, BFS 문제!!! 너무 뿌듯했다.
    디버깅해서 dfs에서 답안 배열이 계속 초기화되는 것을 알아내고 전역 변수로 바꿔서 해결.
    그리고 결과 숫자 순서가 이상하길래 문제를 다시 봤더니, "정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고" 라는 제시어가 있어서 엣지 연결 후에 정렬했다.
    콘솔에 찍을 때 대괄호랑 쉼표 없애는 건 하드코딩으로 해결했다.
    위에 풀었던 문제에서 방문 배열 초기화했던 로직이 생각나서, dfs돌고 나서 bfs 돌기 전에 착실히 초기화함. 굿굿,,
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    static List<Integer>[] A;
    static boolean[] visited;
    static List<Integer> dfsAnswer;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //선언
        StringTokenizer stringTokenizer = new StringTokenizer(br.readLine());

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

        //초기화
        dfsAnswer = new ArrayList<>();
        A = new ArrayList[N + 1];
        visited = new boolean[N + 1];

        for (int i = 1; i < N + 1; i++) {
            A[i] = new ArrayList<>();
        }

        //양방향 엣지 연결
        for (int i = 0; i < M; i++) {
            stringTokenizer = new StringTokenizer(br.readLine());
            int S = Integer.parseInt(stringTokenizer.nextToken());
            int E = Integer.parseInt(stringTokenizer.nextToken());
            A[S].add(E);
            A[E].add(S);
        }

        for (int i = 1; i < N + 1; i++) {
            Collections.sort(A[i]);
        }

        List<Integer> dfs = DFS(V, dfsAnswer);
        visited = new boolean[N + 1];
        List<Integer> bfs = BFS(V);

        System.out.println(dfs.toString().substring(1, dfs.toString().length() - 1).replaceAll(",", ""));
        System.out.println(bfs.toString().substring(1, dfs.toString().length() - 1).replaceAll(",", ""));
    }

    public static List<Integer> DFS(int v, List<Integer> dfsAnswer) {
        if (visited[v]) {
            return dfsAnswer;
        }
        visited[v] = true;
        dfsAnswer.add(v);
        for (int i : A[v]) {
            if (!visited[i]) {
                DFS(i, dfsAnswer);
            }
        }
        return dfsAnswer;
    }

    public static List<Integer> BFS(int v) {
        List<Integer> answer = new ArrayList<>();
        Queue queue = new LinkedList<Integer>();
        queue.add(v);
        visited[v] = true;

        while (!queue.isEmpty()) {
            int poll = (int) queue.poll();
            for (int i : A[poll]) {
                if (!visited[i]) {
                    queue.add(i);
                    visited[i] = true;
                }
            }
            answer.add(poll);
        }
        return answer;
    }
}

[ 유어클래스 다시 읽기 ]

  • section2. Spring Framework 기본
    • framework 와 library 차이 : 어플리케이션에 대한 주도권(제어권) 차이
    • Spring Framework 특장점
    • Servlet : 클라이언트 웹 요청 처리 Java 클래스
    • JSP -> Servlet -> Spring MVC(설정파일.xml) -> Spring Boot
    • 소프트웨어 아키텍처
  • section2. Spring Framework의 핵심 개념
    • 스프링 컨테이너, 싱글톤 패턴(only one instance), Bean, DI, Test(BDD)
    • 싱글톤 레지스트리(Singleton Registry) : 싱글톤으로 객체 생성 및 관리 기능 By CGLIB(바이트코드 조작 라이브러리)
    • Bean 객체 생명 주기
    • @ComponentScan, @Component, @Autowired
    • @Autowired가 조회한 Bean의 타입이 2개 이상인 경우 해결 방법

[ 느낀 점 ]

오늘 벨로그 서버 오류가 엄청났다.
다행히 저녁 업로드는 정상적으로 진행.
그동안 쭉 써온 일기들을 조금 분류하고 싶어서 시리즈를 만들까했는데, 시리즈도 그다지 깔끔해보이지는 않아서 고민이다.
일단 태그는 좀 더 추가하여 수정했다.

오늘은 BFS, DFS 기본 문제를 스스로 풀어서 뿌듯했던 날..

0개의 댓글