이 영역을 누르면 첫 페이지로 이동
쿄코코 블로그의 첫 페이지로 이동

쿄코코

페이지 맨 위로 올라가기

쿄코코

얼레벌레 생활🤯

[이코테]CHAPTER 05 DFS/BFS - 스택, 큐, 재귀함수, DFS

  • 2022.05.17 23:18
  • Study Platform📚/(알고리즘)- [이코테] 이것이 코딩테스트다 정리
    반응형

    탐색(Search) :  많은 양의 데이터 중에서 원하는 데이터를 찾는 과정

    대표적인 탐색 알고리즘으로 DFS, BFS , 이 두 알고리즘을 이해하기 위해서 스택, 큐, 재귀 함수를 알아야한다.

    참고자료.

    https://gmlwjd9405.github.io/2018/08/03/data-structure-stack.html

     

    스택(Stack)= 박스 쌓기

    : 한 쪽 끝에서만 자료를 넣고 뺄 수 있는 LIFO(Last In First Out) 또는 LILO(Last In Last Out) 구조

    • 스택 메서드( java 라이브러리)

         * push(E item) : 해당 item을 Stack의 top에 삽입

         * pop( ): Stack의 top에 있는 item을 삭제하고 해당 Item을 반환

         * peek( ): Stack의 top에 있는 item을 삭제하지 않고 해당 item을 반환

         * empty( ): Stack이 비어 있으면 true, 비어 있지 않을 경우 false를 반환 

         * search (Object o) : 해당 Object의 위치를 반환, Stack의 top 위치는 1, 해당 Object가 없으면 -1을 반환

    • Python의 리스트 관련 메서드 활용

         * append( ) : 해당 item을 Stack의 top에 삽입

         * pop( ): Stack의 top에 있는 item을 삭제하고 해당 Item을 반환

    stack=[]
    
    stack.append(5)#[5]
    stack.append(2)#[5,2]
    stack.append(3)#[5,2,3]
    stack.append(7)#[5,2,3,7]
    stack.pop()#[5,2,3]
    stack.append(1)#[5,2,3,1]
    stack.append(4)#[5,2,3,1,4]
    stack.pop()#[5,2,3,1]
    print(stack)#[5,2,3,1]
    #최상단 원소부터 출력
    print(stack[::-1])#[1,3,2,5]
    print(len(stack))

    - 배열과 달리 스택은 i번째 항목에 접근 불가

    - 배열처럼 원소들을 하나씩 옆으로 밀어 줄 필요가 없다.


    큐(Queue)

    : 먼저 온 사람이 먼저 들어가기

    from collections import deque
    
    #큐 구현하기 위해 deque 라이브러리 사용
    queue = deque()
    
    queue.append(5)#deque([5])
    queue.append(2)#deque([5,2])
    queue.append(3)#deque([5,2,3)
    queue.append(7)#deque([5,2,3,7])
    queue.popleft()#deque([2,3,7])
    queue.append(1)#deque([2,3,7,1])
    queue.append(4)#deque([2,3,7,1,4])
    queue.popleft()#deque([3, 7, 1, 4])
    
    print(queue)#deque([3, 7, 1, 4])
    queue.reverse()#역순으로 바꾸기
    print(queue)#deque([4, 1, 7, 3])

    재귀 함수(Recursive Function)

    : 자기 자신을 다시 호출하는 함수 

    def recursive_function():
        print('재귀 함수를 호출')
        recursive_function()
    
    recursive_function()

    팩토리얼 함수 표현하기

    def factorial_function(n):
        result=1
        for i in range(1,n+1):
            result*=i
        return result
    
    #재귀 함수 팩토리얼
    def factorial_recursive(n):
        if n<=1:
            return 1
        return n*factorial_recursive(n-1)
    
    print(factorial_function(5))
    print(factorial_recursive(5))

    DFS (Depth -First Search ) : 깊이 우선 탐색,

    그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘 

    1 -> 2 -> 7 -> 6 -> 8 -> 3 -> 4-> 5 순으로 

    def dfs(graph,v,visted):
        #현재 노드를 방문 처리
        visted[v]=True
        print(v,end=' ')
        #현재 노드와 연결된 다른 노드를 재귀적으로 방문
        for i in graph[v]:
            if not visted[i]:#False값일 경우
                dfs(graph,i,visted)
    
    graph=[
        [],#순서 0은 없으므로
        [2,3,8],#1이 연결된 노드 2,3,8
        [1,7],
        [1,4,5],
        [3,5],
        [3,4],
        [7],
        [2,6,8],
        [1,7]
    ]
    #각 노드가 방문된 정보를 리스트를 자료형으로 표현(1차원 리스트)
    visted=[False]*9#0부터 9이므로 9개
    
    dfs(graph,1,visted)

    자바 코드(https://github.com/ndb796/python-for-coding-test/blob/master/5/8.java)

    package s14_dfs;
    
    import java.util.ArrayList;
    
    public class e01_5_8 {
        public static boolean[] visted=new boolean[9];
        public static ArrayList<ArrayList<Integer>> graph = new ArrayList<>();
    
        public static void dfs(int x){
            //현재 방문한 노드 방문처리
            visted[x]=true;
            System.out.print(x+" ");
            for(int i=0;i<graph.get(x).size();i++){
                int y = graph.get(x).get(i);
                if(!visted[y]) dfs(y);
            }
        }
    
        public static void main(String[] args) {
            // 그래프 초기화
            for (int i = 0; i < 9; i++) {
                graph.add(new ArrayList<Integer>());
            }
    
            // 노드 1에 연결된 노드 정보 저장
            graph.get(1).add(2);
            graph.get(1).add(3);
            graph.get(1).add(8);
    
            // 노드 2에 연결된 노드 정보 저장
            graph.get(2).add(1);
            graph.get(2).add(7);
    
            // 노드 3에 연결된 노드 정보 저장
            graph.get(3).add(1);
            graph.get(3).add(4);
            graph.get(3).add(5);
    
            // 노드 4에 연결된 노드 정보 저장
            graph.get(4).add(3);
            graph.get(4).add(5);
    
            // 노드 5에 연결된 노드 정보 저장
            graph.get(5).add(3);
            graph.get(5).add(4);
    
            // 노드 6에 연결된 노드 정보 저장
            graph.get(6).add(7);
    
            // 노드 7에 연결된 노드 정보 저장
            graph.get(7).add(2);
            graph.get(7).add(6);
            graph.get(7).add(8);
    
            // 노드 8에 연결된 노드 정보 저장
            graph.get(8).add(1);
            graph.get(8).add(7);
    
            dfs(1);
        }
    }

     

    반응형

    'Study Platform📚 > (알고리즘)- [이코테] 이것이 코딩테스트다 정리' 카테고리의 다른 글

    [이코테] CHAPTER 09 최단 경로 알고리즘 - 다익스트라 최단 경로 알고리즘  (0) 2022.05.23
    [이코테] CHAPTER 05 DFS/BFS - BFS(deque 메서드) - Python(파이썬),Java(자바)  (0) 2022.05.18
    [이코테] CHAPTER 06 정렬 - 계수 정렬  (0) 2022.05.16
    [이코테]CHAPTER 06 정렬 - 퀵정렬- 파이썬(Python)  (0) 2022.05.15
    [이코테] CHAPTER 07 이진탐색- 순차 탐색, 이분탐색/이진탐색, 이진탐색트리  (0) 2022.05.13

    댓글

    이 글 공유하기

    • 구독하기

      구독하기

    • 카카오톡

      카카오톡

    • 라인

      라인

    • 트위터

      트위터

    • Facebook

      Facebook

    • 카카오스토리

      카카오스토리

    • 밴드

      밴드

    • 네이버 블로그

      네이버 블로그

    • Pocket

      Pocket

    • Evernote

      Evernote

    다른 글

    • [이코테] CHAPTER 09 최단 경로 알고리즘 - 다익스트라 최단 경로 알고리즘

      [이코테] CHAPTER 09 최단 경로 알고리즘 - 다익스트라 최단 경로 알고리즘

      2022.05.23
    • [이코테] CHAPTER 05 DFS/BFS - BFS(deque 메서드) - Python(파이썬),Java(자바)

      [이코테] CHAPTER 05 DFS/BFS - BFS(deque 메서드) - Python(파이썬),Java(자바)

      2022.05.18
    • [이코테] CHAPTER 06 정렬 - 계수 정렬

      [이코테] CHAPTER 06 정렬 - 계수 정렬

      2022.05.16
    • [이코테]CHAPTER 06 정렬 - 퀵정렬- 파이썬(Python)

      [이코테]CHAPTER 06 정렬 - 퀵정렬- 파이썬(Python)

      2022.05.15
    다른 글 더 둘러보기

    정보

    쿄코코 블로그의 첫 페이지로 이동

    쿄코코

    • 쿄코코의 첫 페이지로 이동

    검색

    메뉴

    • 홈

    카테고리

    • 분류 전체보기 (169)
      • Python (24)
        • 😈 99클럽 코테 스터디 4기 TIL (23)
        • 궁금한거 정리 (1)
      • SQL (16)
        • HackerRank (15)
      • [백준] Python,Java로 풀기📖 (71)
        • 정렬(Sorting) (6)
        • 그리디 (5)
        • 문자열 (7)
        • 수학 (3)
        • DFS&BFS (10)
        • 구현 (4)
        • 다이나믹 (17)
        • 이분탐색 (1)
        • 자료구조 (10)
        • 최단거리 (5)
        • 인덱스트리 (0)
      • [프로그래머스]Python,Java로 풀기 (6)
        • Level 1 (4)
        • Level 2 (2)
      • Study Platform📚 (25)
        • (운영체제) - 블로그 및 강의 참고 (0)
        • 김영한👨🏻‍🏫의 스프링 부트와 JPA 실무 완전 .. (5)
        • (알고리즘)- [이코테] 이것이 코딩테스트다 정리 (10)
        • 그림으로 배우는 Http&Network Basic (10)
      • 까먹을까봐 적는 것들 (5)
      • 테스트 보고 난 후..🤔 (0)
      • kt 에이블스쿨 (18)

    최근 글

    인기 글

    댓글

    공지사항

    아카이브

    태그

    • 티스토리챌린지
    • 백준
    • 프로그래머스
    • 항해99
    • 99클럽
    • 오블완
    • TiL
    • 코딩테스트준비

    나의 외부 링크

    정보

    쿄코코의 쿄코코

    쿄코코

    쿄코코

    블로그 구독하기

    • 구독하기
    • RSS 피드

    방문자

    • 전체 방문자
    • 오늘
    • 어제

    티스토리

    • 티스토리 홈
    • 이 블로그 관리하기
    • 글쓰기
    Powered by Tistory / Kakao. © 쿄코코. Designed by Fraccino.

    티스토리툴바