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

쿄코코

페이지 맨 위로 올라가기

쿄코코

얼레벌레 생활🤯

백준 24479(깊이 우선 탐색 1) - Python(파이썬),Java(자바) - DFS

  • 2022.06.01 21:16
  • [백준] Python,Java로 풀기📖/DFS&BFS
    반응형

     

    예제 문제 설명

    1. 1번 노드를 처음 시작하므로 첫번째 방문으로 visted 되었다고 표현하기 위해서 visted[1] 1로 바꿈

    2. 1번 노드와 연결된 2번, 4번 중에 2번 노드가 더 작으므로 2번 노드 방문 -> 2번 노드 2번째로 방문하였으므로 visted[2] 2로 변경

    3. 2번 노드와 연결된 1번,3번,4번 중 방문하지 않은 노드 중에 작은 값인 3번 노드 방문 -> 3번 노드 3번째로 방문하였으므로 visted[3] 3으로 변경

    4. 4번 노드와 연결된 1번,3번,4번 노드 중 방문하지 않은 노드들이 없다.끝

    그러면 5번 노드는 시작 노드 1번으로부터 방문하지 못하는 노드이므로 0으로 그냥 명시 ( 조건에서 방문 못하는 노드는 0이라고 명시하라고 하였으므로)

    결론: 출력은 visted에 몇번째로 출력되는 지 출력되는 거다 !!! 

    ※ 조심하기 ※  출력되는 순서대로 출력하는 것이 아니라 몇번째로 출력되는지( dfs 하면서 출력하면 틀리는 이유)

    풀이 방법 
    * n (정점의 수), m(간선의 수), r(시작 정점), graph( 연결 노드 그래프) , visted( 방문 순서 입력 그래프)
    ① 
    정점의 수(n),간선의 수(m),시작 정점(r) 입력 받기
    ② 간선의 수(m)만큼 입력 graph로 입력받은 후에 다 받고 난 후에 graph마다 하나씩 sort해서 오름차순으로 하게 하기
    ③ dfs 함수 선언하여서 dfs 할 때마다 visted에 cnt 값 부여하기 + dfs 실행 후에는 cnt값 1 증가해서 순차적으로 값 부여하기
    ④ visted 인덱스값이 0인 것은 보기 편하게 하기 위해서 한 것이므로 인덱스의 값이 0일 때 값 빼고 출력하기

    Python (파이썬)

    import sys
    sys.setrecursionlimit(10 ** 6)  # 재귀 허용 깊이를 수동으로 늘려주는 코드
    #정점의 수,간선의 수,시작 정점
    n,m,r= map(int,sys.stdin.readline().split())
    #연결노드 그래프 초기화(1번노드와 인덱스 값이 같게 하기 위해서 n+1로 )
    #[[],[],[],[],[],[]]
    graph=[[] for _ in range(n+1)]
    #방문 순서 그래프 (이것도 인덱스 값과 노드의 값이 동일하게 만드릭 위해서 설정 )
    visted =[0]*(n+1)
    # 순차 입력
    cnt=1
    def dfs(graph,v,visted):
        #함수 밖에 cnt값을 쓰기 위해서 global이라고 명시
        global cnt
        #방문할 때마다 순차 값 변경
        visted[v]=cnt
        #연결된 노드 방문
        for i in graph[v]:
            #방문 안한 노드일 경우
            if visted[i]==0:
                #순차 증가
                cnt+=1
                #dfs 실행
                dfs(graph,i,visted)
    
    #연결된 노드 입력 받기
    for i in range(m):
        u,v = map(int,sys.stdin.readline().split())
        graph[u].append(v)
        graph[v].append(u)
    
    #오름차순 정리
    for i in range(n+1):
        graph[i].sort()
    
    
    dfs(graph,r,visted)
    #순차 출력
    for i in range(n+1):
        if i!=0:
            print(visted[i])

    Java(자바)

    import java.util.*;
    import java.io.*;
    
    public class Main {
        static int n,m,cnt;
        //몇번째 방문인지 
        public static int[] visted;
        //연결된 노드
        public static ArrayList<ArrayList<Integer>> graph = new ArrayList<>();
    
    	//dfs 
        public static void dfs(int x){
        	//순차 정함 
            visted[x]=cnt;
            for(int i=0;i<graph.get(x).size();i++){
            	//연결된 노드
                int y = graph.get(x).get(i);
                //방문을 안했을 경우
                if(visted[y]==0){
                	//순차 증가
                    cnt++;
                    //dfs 실행
                    dfs(y);
                }
            }
        }
    
        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());
            //간선의 개수
            m = Integer.parseInt(st.nextToken());
            //처음 노드
            int r =Integer.parseInt(st.nextToken());
            //연결된 노드 초기화
            for(int i=0;i<n+1;i++){
                graph.add(new ArrayList<Integer>());
            }
            //연결된 노드 체크
            for(int i=0;i<m;i++){
                st = new StringTokenizer(br.readLine()," ");
                int u = Integer.parseInt(st.nextToken());
                int v = Integer.parseInt(st.nextToken());
                graph.get(u).add(v);
                graph.get(v).add(u);
            }
            //노드마다 오름차순
            for(int i=0;i<graph.size();i++){
                Collections.sort(graph.get(i));
            }
            cnt=1;
            visted= new int[n+1];
            dfs(r);
            for(int i=0;i<visted.length;i++){
                if(i!=0) System.out.println(visted[i]);
            }
        }
    }

     

    반응형

    '[백준] Python,Java로 풀기📖 > DFS&BFS' 카테고리의 다른 글

    백준 2667(단지번호 붙이기) - Python(파이썬) - BFS  (0) 2022.06.14
    백준 2178(미로 탐색) - Python(파이썬) - BFS  (0) 2022.06.14
    백준 18352(특정 거리의 도시 찾기) - Python(파이썬) -BFS  (0) 2022.05.25
    백준 16948(데스나이트) - Python(파이썬),자바(Java)  (0) 2022.05.24
    백준 4936(섬의 개수) - BFS 풀기  (0) 2022.05.21

    댓글

    이 글 공유하기

    • 구독하기

      구독하기

    • 카카오톡

      카카오톡

    • 라인

      라인

    • 트위터

      트위터

    • Facebook

      Facebook

    • 카카오스토리

      카카오스토리

    • 밴드

      밴드

    • 네이버 블로그

      네이버 블로그

    • Pocket

      Pocket

    • Evernote

      Evernote

    다른 글

    • 백준 2667(단지번호 붙이기) - Python(파이썬) - BFS

      백준 2667(단지번호 붙이기) - Python(파이썬) - BFS

      2022.06.14
    • 백준 2178(미로 탐색) - Python(파이썬) - BFS

      백준 2178(미로 탐색) - Python(파이썬) - BFS

      2022.06.14
    • 백준 18352(특정 거리의 도시 찾기) - Python(파이썬) -BFS

      백준 18352(특정 거리의 도시 찾기) - Python(파이썬) -BFS

      2022.05.25
    • 백준 16948(데스나이트) - Python(파이썬),자바(Java)

      백준 16948(데스나이트) - Python(파이썬),자바(Java)

      2022.05.24
    다른 글 더 둘러보기

    정보

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

    쿄코코

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

    검색

    메뉴

    • 홈

    카테고리

    • 분류 전체보기 (168)
      • 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)
      • 까먹을까봐 적는 것들 (4)
      • 테스트 보고 난 후..🤔 (0)
      • kt 에이블스쿨 (18)

    최근 글

    인기 글

    댓글

    공지사항

    아카이브

    태그

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

    나의 외부 링크

    정보

    쿄코코의 쿄코코

    쿄코코

    쿄코코

    블로그 구독하기

    • 구독하기
    • RSS 피드

    방문자

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

    티스토리

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

    티스토리툴바